mirror of
https://github.com/openvk/openvk
synced 2024-11-11 01:19:53 +03:00
Merge from 'master' branch
This commit is contained in:
commit
fd9107749d
38 changed files with 460 additions and 100 deletions
11
CODE-OF-CONFLICT.md
Normal file
11
CODE-OF-CONFLICT.md
Normal file
|
@ -0,0 +1,11 @@
|
|||
The OpenVK development effort is a very personal process compared to "traditional" ways of developing software.
|
||||
Your code and ideas behind it will be carefully reviewed, often resulting in critique and criticism.
|
||||
The review will almost always require improvements to the code before it can be included in the repo.
|
||||
Know that this happens because everyone involved wants to see the best possible solution for the overall success of OpenVK.
|
||||
|
||||
If however, anyone feels personally abused, threatened, or otherwise uncomfortable due to this process, that is not acceptable.
|
||||
If so, please contact the community manager @WerySkok and report the issue.
|
||||
|
||||
As a reviewer of code, please strive to keep things civil and focused on the technical issues involved. We are all humans,
|
||||
and frustrations can be high on both sides of the process.
|
||||
Try to keep in mind the immortal words of Bill and Ted, "Be excellent to each other."
|
277
CODE-STYLE.md
Normal file
277
CODE-STYLE.md
Normal file
|
@ -0,0 +1,277 @@
|
|||
# Names
|
||||
## Namespace Names
|
||||
Namespaces should be written in PascalCase.
|
||||
|
||||
## File Names
|
||||
Code directories should have their name written in PascalCase. Code files should contain only one class and have the name of that class.
|
||||
In case of multiple class definitions in one file, it's name should be the same as the "primary" class name.
|
||||
Non-code directories, non-class and non-code files should be named in lisp-case.
|
||||
|
||||
## Variable Names
|
||||
Variable names should be written in camelCase. This also applies to function arguments, class instance names and methods.
|
||||
|
||||
## Constant Names
|
||||
Constants are written in SCREAMING_SNAKE_CASE, but should be declared case-insensetive.
|
||||
|
||||
## Class Names
|
||||
Classes in OpenVK should belong to `openvk\` namespace and be in the corresponding directory (according to PSR-4). Names of classes should be written in PascalCase.
|
||||
|
||||
## Function Names
|
||||
camelCase and snake_case are allowed, but first one is the recommended way. This rule does not apply to class methods, which are written in camelCase only.
|
||||
|
||||
---
|
||||
|
||||
# Coding Rules
|
||||
## File header
|
||||
All OpenVK files must start with `<?php` open-tag followed by `declare(strict_types=1);` on the same line. The next line must contain namespace.
|
||||
The lines after must contain use-declarations, each on it's own line (usage of {} operator is OK), if there is any. Then there must be an empty line. Example:
|
||||
```php
|
||||
<?php declare(strict_types=1);
|
||||
namespace openvk;
|
||||
use Chandler\Database\DatabaseConnection;
|
||||
use Nette\Utils\{Image, FileSystem};
|
||||
|
||||
class ...
|
||||
```
|
||||
|
||||
## NULL
|
||||
Null should be written as constant, all-uppercase: `NULL`.
|
||||
|
||||
## Nullable (optional) pointer arguments
|
||||
Optional pointer arguments should default to `nullptr`: `function something(&int? $myPointer = nullptr)`. `nullptr` must be written in lisp-case (lowercase).
|
||||
|
||||
## Comparing to NULL
|
||||
In OpenVK `is_null` is the preferred way to check for equality to NULL. `??` must be used in assignments and where else possible.
|
||||
In case if value can either be NULL or truthy, "boolean not" should be used to check if value is not null: `if(!$var)`.
|
||||
|
||||
## Arrays
|
||||
Arrays must be defined with modern syntax: `[1, 2, 3]` (NOT `array(1, 2, 3)`).
|
||||
Same applies to `list` construction: use `[$a, , $b] = $arr;` instead of `list($a, , $b) = $arr;`
|
||||
|
||||
## Casts
|
||||
Typecasts must be done with modern syntax where possible: `(type) $var`. Int-to-string, string-to-int, etc conversions should also be dont with modern casting
|
||||
syntax where possible, but should use `ctype_` functions where needed. `gettype`, `settype` should be used in dynamic programming only.
|
||||
|
||||
## Goto
|
||||
```goto``` should be avoided.
|
||||
|
||||
## `continue n; `
|
||||
It is preferable to use `continue n`, `break n` instead of guarding flags:
|
||||
```php
|
||||
# COOL AND GOOD
|
||||
foreach($a as $b)
|
||||
foreach($b as $c)
|
||||
if($b == $c)
|
||||
break 2;
|
||||
|
||||
# BRUH
|
||||
foreach($a as $b) {
|
||||
$shouldBreak = false;
|
||||
foreach($b as $c)
|
||||
if($b == $c)
|
||||
$shouldBreak = true;
|
||||
|
||||
if($shouldBreak)
|
||||
break;
|
||||
}
|
||||
```
|
||||
|
||||
## Comments
|
||||
In OpenVK we use Perl-style `#` for single-line comments.
|
||||
|
||||
---
|
||||
|
||||
# Formatting
|
||||
## Variables
|
||||
It is preferable to declare only one variable per line in the code.
|
||||
|
||||
## Indentation
|
||||
All things in OpenVK must be properly indented by a sequence of 4 spaces. Not tabs. \
|
||||
When there are several variable declarations listed together, line up the variables:
|
||||
```php
|
||||
# OK
|
||||
$photos = (new Photos)->where("meow", true);
|
||||
$photo = $photos->fetch();
|
||||
$arr = [
|
||||
"a" => 10,
|
||||
"bb" => true,
|
||||
];
|
||||
|
||||
# NOT OK
|
||||
$photos = (new Photos)->where("meow", true);
|
||||
$photo = $photos->fetch();
|
||||
$arr = [
|
||||
"a" => 10,
|
||||
"bb" => true,
|
||||
];
|
||||
```
|
||||
|
||||
## Tab/Space
|
||||
+ **Do not use tabs**. Use spaces, as tabs are defined differently for different editors and printers.
|
||||
+ Put one space after a comma and semicolons: `exp(1, 2)` `for($i = 1; $i < 100; $i++)`
|
||||
+ Put one space around assignment operators: `$a = 1`
|
||||
+ Always put a space around conditional operators: `$a = ($a > $b) ? $a : $b`
|
||||
+ Do not put spaces between unary operators and their operands, primary operators and keywords:
|
||||
```php
|
||||
# OK
|
||||
-$a;
|
||||
$a++;
|
||||
$b[1] = $a;
|
||||
fun($b);
|
||||
if($a) { ... }
|
||||
|
||||
# NOT OK
|
||||
- $a;
|
||||
$a ++;
|
||||
$b [1] = $a;
|
||||
fun ($b);
|
||||
if ($a) { ... }
|
||||
```
|
||||
|
||||
## Blank Lines
|
||||
+ Use blank lines to create paragraphs in the code or comments to make the code more understandable
|
||||
+ Use blank lines before `return` statement if it isn't the only statement in the block
|
||||
+ Use blank lines after shorthand if/else/etc
|
||||
```php
|
||||
# OK
|
||||
if($a)
|
||||
return $x;
|
||||
|
||||
doSomething();
|
||||
|
||||
return "yay";
|
||||
|
||||
# NOT OK
|
||||
if($a) return $x; # return must be on separate line
|
||||
doSomething(); # doSomething must be separated by an extra blank line after short if/else
|
||||
return "yay"; # do use blank lines before return statement
|
||||
```
|
||||
|
||||
|
||||
## Method/Function Arguments
|
||||
+ When all arguments for a function do not fit on one line, try to line up the first argument in each line:
|
||||
![image](https://user-images.githubusercontent.com/34442450/167248563-21fb01be-181d-48b9-ac0c-dc953c0a12cf.png)
|
||||
|
||||
+ If the argument lists are still too long to fit on the line, you may line up the arguments with the method name instead.
|
||||
|
||||
## Maximum characters per line
|
||||
Lines should be no more than 80 characters long.
|
||||
|
||||
## Usage of curly braces
|
||||
+ Curly braces should be on separate line for class, method, and function definitions.
|
||||
+ In loops, if/else, try/catch, switch constructions the opening brace should be on the same line as the operator.
|
||||
+ Braces must be ommited if the block contains only one statement **AND** the related blocks are also single statemented.
|
||||
+ Nested single-statement+operator blocks must not be surrounded by braces.
|
||||
```php
|
||||
# OK
|
||||
class A
|
||||
{
|
||||
function doSomethingFunny(): int
|
||||
{
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
if(true) {
|
||||
doSomething();
|
||||
doSomethingElse();
|
||||
} else {
|
||||
doSomethingFunny();
|
||||
}
|
||||
|
||||
if($a)
|
||||
return false;
|
||||
else
|
||||
doSomething();
|
||||
|
||||
foreach($b as $c => $d)
|
||||
if($c == $d)
|
||||
unset($b[$c]);
|
||||
|
||||
# NOT OK
|
||||
class A {
|
||||
function doSomethingFunny(): int {
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
|
||||
if(true) {
|
||||
doSomething();
|
||||
doSomethingElse();
|
||||
} else
|
||||
doSomethingFunny(); # why?
|
||||
|
||||
if($a) {
|
||||
return false;
|
||||
} else {
|
||||
doSomething();
|
||||
}
|
||||
|
||||
foreach($b as $c => $d) {
|
||||
if($c == $d)
|
||||
unset($b[$c]);
|
||||
}
|
||||
|
||||
# lmao
|
||||
if($a) { doSomething(); } else doSomethingElse();
|
||||
```
|
||||
|
||||
## if/else, try/catch
|
||||
+ Operators must not be indented with space from their operands but must have 1-space margin from braces:
|
||||
```php
|
||||
# OK
|
||||
if($a) {
|
||||
doSomething();
|
||||
doSomethingElse();
|
||||
} else if($b) {
|
||||
try {
|
||||
nukeSaintPetersburg('😈');
|
||||
} finally {
|
||||
return PEACE;
|
||||
}
|
||||
}
|
||||
|
||||
# NOT OK
|
||||
if ($a) { # do not add space between control flow operator IF and it's operand
|
||||
doSomething();
|
||||
doSomethingElse();
|
||||
}elseif($b){ # do add margin from braces; also ELSE and IF should be separate here
|
||||
try{
|
||||
nukeSaintPetersburg('😈');
|
||||
}finally{
|
||||
return PEACE;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Switches
|
||||
+ `break` must be on same indentation level as the code of le case (not the case definiton itself)
|
||||
+ If there is no need to `break` a comment `# NOTICE falling through` must be places instead
|
||||
```php
|
||||
# OK
|
||||
switch($a) {
|
||||
case 1:
|
||||
echo $a;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
echo $a++;
|
||||
# NOTICE falling through
|
||||
|
||||
default:
|
||||
echo "c";
|
||||
}
|
||||
|
||||
# NOT OK
|
||||
switch($a) {
|
||||
case 1:
|
||||
echo $a;
|
||||
break;
|
||||
|
||||
case 2:
|
||||
echo $a++;
|
||||
|
||||
default:
|
||||
echo "c";
|
||||
}
|
||||
```
|
|
@ -13,9 +13,9 @@ final class Account extends VKAPIRequestHandler
|
|||
"last_name" => $this->getUser()->getLastName(),
|
||||
"home_town" => $this->getUser()->getHometown(),
|
||||
"status" => $this->getUser()->getStatus(),
|
||||
"bdate" => "1.1.1970", // TODO
|
||||
"bdate_visibility" => 0, // TODO
|
||||
"phone" => "+420 ** *** 228", // TODO
|
||||
"bdate" => "1.1.1970", # TODO
|
||||
"bdate_visibility" => 0, # TODO
|
||||
"phone" => "+420 ** *** 228", # TODO
|
||||
"relation" => $this->getUser()->getMaritalStatus(),
|
||||
"sex" => $this->getUser()->isFemale() ? 1 : 2
|
||||
];
|
||||
|
@ -25,12 +25,12 @@ final class Account extends VKAPIRequestHandler
|
|||
{
|
||||
$this->requireUser();
|
||||
|
||||
// Цiй метод є заглушка
|
||||
# Цiй метод є заглушка
|
||||
|
||||
return (object) [
|
||||
"2fa_required" => 0,
|
||||
"country" => "CZ", // TODO
|
||||
"eu_user" => false, // TODO
|
||||
"country" => "CZ", # TODO
|
||||
"eu_user" => false, # TODO
|
||||
"https_required" => 1,
|
||||
"intro" => 0,
|
||||
"community_comments" => false,
|
||||
|
@ -55,7 +55,7 @@ final class Account extends VKAPIRequestHandler
|
|||
{
|
||||
$this->requireUser();
|
||||
|
||||
// Цiй метод є заглушка
|
||||
# Цiй метод є заглушка
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -73,6 +73,6 @@ final class Account extends VKAPIRequestHandler
|
|||
"messages" => $this->getUser()->getUnreadMessagesCount()
|
||||
];
|
||||
|
||||
// TODO: Filter
|
||||
# TODO: Filter
|
||||
}
|
||||
}
|
||||
|
|
|
@ -25,7 +25,7 @@ final class Friends extends VKAPIRequestHandler
|
|||
$usersApi = new Users($this->getUser());
|
||||
|
||||
if (!is_null($fields)) {
|
||||
$response = $usersApi->get(implode(',', $friends), $fields, 0, $count); // FIXME
|
||||
$response = $usersApi->get(implode(',', $friends), $fields, 0, $count); # FIXME
|
||||
}
|
||||
|
||||
return (object) [
|
||||
|
|
|
@ -48,7 +48,7 @@ final class Groups extends VKAPIRequestHandler
|
|||
"name" => "DELETED",
|
||||
"deactivated" => "deleted"
|
||||
];
|
||||
}else if($clbs[$i] == null){
|
||||
}else if($clbs[$i] == NULL){
|
||||
|
||||
}else{
|
||||
$rClubs[$i] = (object)[
|
||||
|
@ -95,10 +95,10 @@ final class Groups extends VKAPIRequestHandler
|
|||
|
||||
$clubs = new ClubsRepo;
|
||||
|
||||
if ($group_ids == null && $group_id != null)
|
||||
if ($group_ids == NULL && $group_id != NULL)
|
||||
$group_ids = $group_id;
|
||||
|
||||
if ($group_ids == null && $group_id == null)
|
||||
if ($group_ids == NULL && $group_id == NULL)
|
||||
$this->fail(100, "One of the parameters specified was missing or invalid: group_ids is undefined");
|
||||
|
||||
$clbs = explode(',', $group_ids);
|
||||
|
@ -123,7 +123,7 @@ final class Groups extends VKAPIRequestHandler
|
|||
"type" => "group",
|
||||
"description" => "This group was deleted or it doesn't exist"
|
||||
];
|
||||
}else if($clbs[$i] == null){
|
||||
}else if($clbs[$i] == NULL){
|
||||
|
||||
}else{
|
||||
$response[$i] = (object)[
|
||||
|
|
|
@ -63,7 +63,7 @@ final class Likes extends VKAPIRequestHandler
|
|||
|
||||
return (object)[
|
||||
"liked" => (int) $post->hasLikeFrom($user),
|
||||
"copied" => 0 // TODO: handle this
|
||||
"copied" => 0 # TODO: handle this
|
||||
];
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -7,9 +7,9 @@ final class Users extends VKAPIRequestHandler
|
|||
{
|
||||
function get(string $user_ids = "0", string $fields = "", int $offset = 0, int $count = 100, User $authuser = null /* костыль(( */): array
|
||||
{
|
||||
// $this->requireUser();
|
||||
# $this->requireUser();
|
||||
|
||||
if($authuser == null) $authuser = $this->getUser();
|
||||
if($authuser == NULL) $authuser = $this->getUser();
|
||||
|
||||
$users = new UsersRepo;
|
||||
if($user_ids == "0")
|
||||
|
@ -34,7 +34,7 @@ final class Users extends VKAPIRequestHandler
|
|||
"last_name" => "",
|
||||
"deactivated" => "deleted"
|
||||
];
|
||||
}else if($usrs[$i] == null){
|
||||
}else if($usrs[$i] == NULL){
|
||||
|
||||
}else{
|
||||
$response[$i] = (object)[
|
||||
|
@ -73,21 +73,21 @@ final class Users extends VKAPIRequestHandler
|
|||
case 'photo_200':
|
||||
$response[$i]->photo_50 = $usr->getAvatarURL("normal");
|
||||
break;
|
||||
case 'photo_200_orig': // вообще не ебу к чему эта строка ну пусть будет кек
|
||||
case 'photo_200_orig': # вообще не ебу к чему эта строка ну пусть будет кек
|
||||
$response[$i]->photo_50 = $usr->getAvatarURL("normal");
|
||||
break;
|
||||
case 'photo_400_orig':
|
||||
$response[$i]->photo_50 = $usr->getAvatarURL("normal");
|
||||
break;
|
||||
|
||||
// Она хочет быть выебанной видя матан
|
||||
// Покайфу когда ты Виет а вокруг лишь дискриминант
|
||||
# Она хочет быть выебанной видя матан
|
||||
# Покайфу когда ты Виет а вокруг лишь дискриминант
|
||||
case 'status':
|
||||
if($usr->getStatus() != null)
|
||||
if($usr->getStatus() != NULL)
|
||||
$response[$i]->status = $usr->getStatus();
|
||||
break;
|
||||
case 'screen_name':
|
||||
if($usr->getShortCode() != null)
|
||||
if($usr->getShortCode() != NULL)
|
||||
$response[$i]->screen_name = $usr->getShortCode();
|
||||
break;
|
||||
case 'friend_status':
|
||||
|
|
|
@ -32,7 +32,7 @@ final class Wall extends VKAPIRequestHandler
|
|||
$attachments[] = [
|
||||
"type" => "photo",
|
||||
"photo" => [
|
||||
"album_id" => $attachment->getAlbum() ? $attachment->getAlbum()->getId() : null,
|
||||
"album_id" => $attachment->getAlbum() ? $attachment->getAlbum()->getId() : NULL,
|
||||
"date" => $attachment->getPublicationTime()->timestamp(),
|
||||
"id" => $attachment->getVirtualId(),
|
||||
"owner_id" => $attachment->getOwner()->getId(),
|
||||
|
@ -51,10 +51,10 @@ final class Wall extends VKAPIRequestHandler
|
|||
"date" => $post->getPublicationTime()->timestamp(),
|
||||
"post_type" => "post",
|
||||
"text" => $post->getText(),
|
||||
"can_edit" => 0, // TODO
|
||||
"can_edit" => 0, # TODO
|
||||
"can_delete" => $post->canBeDeletedBy($this->getUser()),
|
||||
"can_pin" => $post->canBePinnedBy($this->getUser()),
|
||||
"can_archive" => false, // TODO MAYBE
|
||||
"can_archive" => false, # TODO MAYBE
|
||||
"is_archived" => false,
|
||||
"is_pinned" => $post->isPinned(),
|
||||
"attachments" => $attachments,
|
||||
|
@ -80,7 +80,7 @@ final class Wall extends VKAPIRequestHandler
|
|||
else
|
||||
$groups[] = $from_id * -1;
|
||||
|
||||
$attachments = null; // free attachments so it will not clone everythingg
|
||||
$attachments = NULL; # free attachments so it will not clone everythingg
|
||||
}
|
||||
|
||||
if($extended == 1)
|
||||
|
@ -135,9 +135,9 @@ final class Wall extends VKAPIRequestHandler
|
|||
];
|
||||
}
|
||||
|
||||
function getById(string $posts, int $extended = 0, string $fields = "", User $user = null)
|
||||
function getById(string $posts, int $extended = 0, string $fields = "", User $user = NULL)
|
||||
{
|
||||
if($user == null) $user = $this->getUser(); // костыли костыли крылышки
|
||||
if($user == NULL) $user = $this->getUser(); # костыли костыли крылышки
|
||||
|
||||
$items = [];
|
||||
$profiles = [];
|
||||
|
@ -160,7 +160,7 @@ final class Wall extends VKAPIRequestHandler
|
|||
$attachments[] = [
|
||||
"type" => "photo",
|
||||
"photo" => [
|
||||
"album_id" => $attachment->getAlbum() ? $attachment->getAlbum()->getId() : null,
|
||||
"album_id" => $attachment->getAlbum() ? $attachment->getAlbum()->getId() : NULL,
|
||||
"date" => $attachment->getPublicationTime()->timestamp(),
|
||||
"id" => $attachment->getVirtualId(),
|
||||
"owner_id" => $attachment->getOwner()->getId(),
|
||||
|
@ -196,7 +196,7 @@ final class Wall extends VKAPIRequestHandler
|
|||
"width" => 1280,
|
||||
],
|
||||
[
|
||||
"height" => 75, // Для временного компросима оставляю статическое число. Если каждый раз обращаться к файлу за количеством пикселов, то наступает пuпuська полная с производительностью, так что пока так
|
||||
"height" => 75, # Для временного компросима оставляю статическое число. Если каждый раз обращаться к файлу за количеством пикселов, то наступает пuпuська полная с производительностью, так что пока так
|
||||
"url" => $attachment->getURLBySizeId("miniscule"),
|
||||
"type" => "s",
|
||||
"width" => 75,
|
||||
|
@ -215,10 +215,10 @@ final class Wall extends VKAPIRequestHandler
|
|||
"date" => $post->getPublicationTime()->timestamp(),
|
||||
"post_type" => "post",
|
||||
"text" => $post->getText(),
|
||||
"can_edit" => 0, // TODO
|
||||
"can_edit" => 0, # TODO
|
||||
"can_delete" => $post->canBeDeletedBy($user),
|
||||
"can_pin" => $post->canBePinnedBy($user),
|
||||
"can_archive" => false, // TODO MAYBE
|
||||
"can_archive" => false, # TODO MAYBE
|
||||
"is_archived" => false,
|
||||
"is_pinned" => $post->isPinned(),
|
||||
"post_source" => (object)["type" => "vk"],
|
||||
|
@ -244,7 +244,7 @@ final class Wall extends VKAPIRequestHandler
|
|||
else
|
||||
$groups[] = $from_id * -1;
|
||||
|
||||
$attachments = null; // free attachments so it will not clone everythingg
|
||||
$attachments = NULL; # free attachments so it will not clone everythingg
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -335,12 +335,12 @@ final class Wall extends VKAPIRequestHandler
|
|||
if($signed == 1)
|
||||
$flags |= 0b01000000;
|
||||
|
||||
// TODO: Compatible implementation of this
|
||||
# TODO: Compatible implementation of this
|
||||
try {
|
||||
$photo = null;
|
||||
$video = null;
|
||||
$photo = NULL;
|
||||
$video = NULL;
|
||||
if($_FILES["photo"]["error"] === UPLOAD_ERR_OK) {
|
||||
$album = null;
|
||||
$album = NULL;
|
||||
if(!$anon && $owner_id > 0 && $owner_id === $this->getUser()->getId())
|
||||
$album = (new AlbumsRepo)->getUserWallAlbum($wallOwner);
|
||||
|
||||
|
|
|
@ -302,8 +302,8 @@ class Club extends RowModel
|
|||
{
|
||||
$manager = (new Managers)->getByUserAndClub($user->getId(), $this->getId());
|
||||
|
||||
if ($ignoreHidden && $manager !== null && $manager->isHidden())
|
||||
return null;
|
||||
if ($ignoreHidden && $manager !== NULL && $manager->isHidden())
|
||||
return NULL;
|
||||
|
||||
return $manager;
|
||||
}
|
||||
|
|
|
@ -131,7 +131,7 @@ class Correspondence
|
|||
*/
|
||||
function getPreviewMessage(): ?Message
|
||||
{
|
||||
$messages = $this->getMessages(1, null, 1);
|
||||
$messages = $this->getMessages(1, NULL, 1);
|
||||
return $messages[0] ?? NULL;
|
||||
}
|
||||
|
||||
|
|
|
@ -126,7 +126,7 @@ class Message extends RowModel
|
|||
],
|
||||
"timing" => [
|
||||
"sent" => (string) $this->getSendTime()->format("%e %B %G" . tr("time_at_sp") . "%X"),
|
||||
"edited" => is_null($this->getEditTime()) ? null : (string) $this->getEditTime(),
|
||||
"edited" => is_null($this->getEditTime()) ? NULL : (string) $this->getEditTime(),
|
||||
],
|
||||
"text" => $this->getText(),
|
||||
"read" => !$this->isUnread(),
|
||||
|
|
|
@ -87,7 +87,7 @@ abstract class Postable extends Attachable
|
|||
]));
|
||||
}
|
||||
|
||||
// TODO add pagination
|
||||
# TODO add pagination
|
||||
function getLikers(): \Traversable
|
||||
{
|
||||
$sel = DB::i()->getContext()->table("likes")->where([
|
||||
|
|
|
@ -877,7 +877,7 @@ class User extends RowModel
|
|||
return true;
|
||||
}
|
||||
|
||||
function setEmail(string $email): void
|
||||
function changeEmail(string $email): void
|
||||
{
|
||||
DatabaseConnection::i()->getContext()->table("ChandlerUsers")
|
||||
->where("id", $this->getChandlerUser()->getId())->update([
|
||||
|
@ -939,7 +939,7 @@ class User extends RowModel
|
|||
return $this->getRecord()->website;
|
||||
}
|
||||
|
||||
// ты устрица
|
||||
# ты устрица
|
||||
function isActivated(): bool
|
||||
{
|
||||
return (bool) $this->getRecord()->activated;
|
||||
|
|
|
@ -63,7 +63,7 @@ class Video extends Media
|
|||
|
||||
if(!file_exists($this->getFileName())) {
|
||||
if((time() - $this->getRecord()->last_checked) > 3600) {
|
||||
// TODO notify that video processor is probably dead
|
||||
# TODO notify that video processor is probably dead
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
@ -39,7 +39,7 @@ class Notes
|
|||
if(!is_null($note))
|
||||
return new Note($note);
|
||||
else
|
||||
return null;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
function getUserNotesCount(User $user): int
|
||||
|
|
|
@ -96,7 +96,7 @@ class Posts
|
|||
if(!is_null($post))
|
||||
return new Post($post);
|
||||
else
|
||||
return null;
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
<?php declare(strict_types=1);
|
||||
namespace openvk\Web\Models\Repositories;
|
||||
// use openvk\Web\Models\Entities\Ticket;
|
||||
// use openvk\Web\Models\Entities\User;
|
||||
// use openvk\Web\Models\Repositories\Users;
|
||||
# use openvk\Web\Models\Entities\Ticket;
|
||||
# use openvk\Web\Models\Entities\User;
|
||||
# use openvk\Web\Models\Repositories\Users;
|
||||
use openvk\Web\Models\Entities\TicketComment;
|
||||
use Chandler\Database\DatabaseConnection;
|
||||
|
||||
|
@ -22,31 +22,31 @@ class TicketComments
|
|||
foreach($this->comments->where(['ticket_id' => $ticket_id, 'deleted' => 0]) as $comment) yield new TicketComment($comment);
|
||||
}
|
||||
|
||||
// private function toTicket(?ActiveRow $ar): ?Ticket
|
||||
// {
|
||||
// return is_null($ar) ? NULL : new Ticket($ar);
|
||||
// }
|
||||
# private function toTicket(?ActiveRow $ar): ?Ticket
|
||||
# {
|
||||
# return is_null($ar) ? NULL : new Ticket($ar);
|
||||
# }
|
||||
|
||||
// function getTicketsByuId(int $user_id): \Traversable
|
||||
// {
|
||||
// foreach($this->tickets->where(['user_id' => $user_id, 'deleted' => 0]) as $ticket) yield new Ticket($ticket);
|
||||
// }
|
||||
# function getTicketsByuId(int $user_id): \Traversable
|
||||
# {
|
||||
# foreach($this->tickets->where(['user_id' => $user_id, 'deleted' => 0]) as $ticket) yield new Ticket($ticket);
|
||||
# }
|
||||
|
||||
// function getRequestById(int $req_id): ?Ticket
|
||||
// {
|
||||
// $requests = $this->tickets->where(['id' => $req_id])->fetch();
|
||||
// if(!is_null($requests))
|
||||
# function getRequestById(int $req_id): ?Ticket
|
||||
# {
|
||||
# $requests = $this->tickets->where(['id' => $req_id])->fetch();
|
||||
# if(!is_null($requests))
|
||||
|
||||
// return new Req($requests);
|
||||
// else
|
||||
// return null;
|
||||
# return new Req($requests);
|
||||
# else
|
||||
# return null;
|
||||
|
||||
// }
|
||||
# }
|
||||
|
||||
// function get(int $id): ?Ticket
|
||||
// {
|
||||
// return $this->toTicket($this->tickets->get($id));
|
||||
// }
|
||||
# function get(int $id): ?Ticket
|
||||
# {
|
||||
# return $this->toTicket($this->tickets->get($id));
|
||||
# }
|
||||
|
||||
function get(int $id): ?TicketComment
|
||||
{
|
||||
|
|
|
@ -50,7 +50,7 @@ class Tickets
|
|||
if(!is_null($requests))
|
||||
return new Req($requests);
|
||||
else
|
||||
return null;
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ class Topics
|
|||
{
|
||||
$perPage = $perPage ?? OPENVK_DEFAULT_PER_PAGE;
|
||||
|
||||
// Get pinned topics first
|
||||
# Get pinned topics first
|
||||
$query = "SELECT `id` FROM `topics` WHERE `pinned` = 1 AND `group` = ? AND `deleted` = 0 UNION SELECT `id` FROM `topics` WHERE `pinned` = 0 AND `group` = ? AND `deleted` = 0";
|
||||
$query .= " LIMIT " . $perPage . " OFFSET " . ($page - 1) * $perPage;
|
||||
|
||||
|
|
|
@ -85,7 +85,7 @@ final class AboutPresenter extends OpenVKPresenter
|
|||
if(is_null($lg))
|
||||
$this->throwError(404, "Not found", "Language is not found");
|
||||
header("Content-Type: application/javascript");
|
||||
echo "window.lang = " . json_encode($localizer->export($lang)) . ";"; // привет хардкод :DDD
|
||||
echo "window.lang = " . json_encode($localizer->export($lang)) . ";"; # привет хардкод :DDD
|
||||
exit;
|
||||
}
|
||||
|
||||
|
@ -120,7 +120,7 @@ final class AboutPresenter extends OpenVKPresenter
|
|||
|
||||
function renderHumansTxt(): void
|
||||
{
|
||||
// :D
|
||||
# :D
|
||||
|
||||
header("HTTP/1.1 302 Found");
|
||||
header("Location: https://github.com/openvk/openvk#readme");
|
||||
|
|
|
@ -60,7 +60,7 @@ final class CommentPresenter extends OpenVKPresenter
|
|||
}
|
||||
}
|
||||
|
||||
// TODO move to trait
|
||||
# TODO move to trait
|
||||
try {
|
||||
$photo = NULL;
|
||||
$video = NULL;
|
||||
|
|
|
@ -89,7 +89,7 @@ final class GroupPresenter extends OpenVKPresenter
|
|||
$this->template->club = $this->clubs->get($id);
|
||||
$this->template->onlyShowManagers = $this->queryParam("onlyAdmins") == "1";
|
||||
if($this->template->onlyShowManagers) {
|
||||
$this->template->followers = null;
|
||||
$this->template->followers = NULL;
|
||||
|
||||
$this->template->managers = $this->template->club->getManagers((int) ($this->queryParam("p") ?? 1), !$this->template->club->canBeModifiedBy($this->user->identity));
|
||||
if($this->template->club->canBeModifiedBy($this->user->identity) || !$this->template->club->isOwnerHidden()) {
|
||||
|
@ -99,7 +99,7 @@ final class GroupPresenter extends OpenVKPresenter
|
|||
$this->template->count = $this->template->club->getManagersCount();
|
||||
} else {
|
||||
$this->template->followers = $this->template->club->getFollowers((int) ($this->queryParam("p") ?? 1));
|
||||
$this->template->managers = null;
|
||||
$this->template->managers = NULL;
|
||||
$this->template->count = $this->template->club->getFollowersCount();
|
||||
}
|
||||
|
||||
|
@ -116,7 +116,7 @@ final class GroupPresenter extends OpenVKPresenter
|
|||
$user = is_null($this->queryParam("user")) ? $this->postParam("user") : $this->queryParam("user");
|
||||
$comment = $this->postParam("comment");
|
||||
$removeComment = $this->postParam("removeComment") === "1";
|
||||
$hidden = ["0" => false, "1" => true][$this->queryParam("hidden")] ?? null;
|
||||
$hidden = ["0" => false, "1" => true][$this->queryParam("hidden")] ?? NULL;
|
||||
//$index = $this->queryParam("index");
|
||||
if(!$user)
|
||||
$this->badRequest();
|
||||
|
|
|
@ -80,11 +80,11 @@ final class InternalAPIPresenter extends OpenVKPresenter
|
|||
if ($postTZ != $sessionOffset || $sessionOffset == null) {
|
||||
Session::i()->set("_timezoneOffset", $postTZ ? $postTZ : 3 * MINUTE );
|
||||
$this->returnJson([
|
||||
"success" => 1 // If it's new value
|
||||
"success" => 1 # If it's new value
|
||||
]);
|
||||
} else {
|
||||
$this->returnJson([
|
||||
"success" => 2 // If it's the same value (if for some reason server will call this func)
|
||||
"success" => 2 # If it's the same value (if for some reason server will call this func)
|
||||
]);
|
||||
}
|
||||
} else {
|
||||
|
|
|
@ -106,7 +106,7 @@ final class MessengerPresenter extends OpenVKPresenter
|
|||
|
||||
$messages = [];
|
||||
$correspondence = new Correspondence($this->user->identity, $correspondent);
|
||||
foreach($correspondence->getMessages(1, $lastMsg === 0 ? null : $lastMsg) as $message)
|
||||
foreach($correspondence->getMessages(1, $lastMsg === 0 ? NULL : $lastMsg) as $message)
|
||||
$messages[] = $message->simplify();
|
||||
|
||||
header("Content-Type: application/json");
|
||||
|
|
|
@ -118,7 +118,7 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
return ($action === "register" || $action === "login");
|
||||
}
|
||||
|
||||
return (bool) $this->user->raw->can($action)->model($model)->whichBelongsTo($context === -1 ? null : $context);
|
||||
return (bool) $this->user->raw->can($action)->model($model)->whichBelongsTo($context === -1 ? NULL : $context);
|
||||
}
|
||||
|
||||
protected function assertPermission(string $model, string $action, int $context, bool $throw = false): void
|
||||
|
@ -252,7 +252,7 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
exit;
|
||||
}
|
||||
|
||||
// ето для емейл уже надо (и по хорошему надо бы избавится от повторяющегося кода мда)
|
||||
# ето для емейл уже надо (и по хорошему надо бы избавится от повторяющегося кода мда)
|
||||
if(!$this->user->identity->isActivated() && !$this->activationTolerant) {
|
||||
header("HTTP/1.1 403 Forbidden");
|
||||
$this->getTemplatingEngine()->render(__DIR__ . "/templates/@email.xml", [
|
||||
|
@ -288,7 +288,7 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
|
||||
$whichbrowser = new WhichBrowser\Parser(getallheaders());
|
||||
$mobiletheme = OPENVK_ROOT_CONF["openvk"]["preferences"]["defaultMobileTheme"];
|
||||
if($mobiletheme && $whichbrowser->isType('mobile') && Session::i()->get("_tempTheme") == null)
|
||||
if($mobiletheme && $whichbrowser->isType('mobile') && Session::i()->get("_tempTheme") == NULL)
|
||||
$this->setSessionTheme($mobiletheme);
|
||||
|
||||
$theme = NULL;
|
||||
|
@ -299,7 +299,7 @@ abstract class OpenVKPresenter extends SimplePresenter
|
|||
$theme = Themepacks::i()[Session::i()->get("_sessionTheme", "ovk")];
|
||||
} else if($this->requestParam("themePreview")) {
|
||||
$theme = Themepacks::i()[$this->requestParam("themePreview")];
|
||||
} else if($this->user->identity !== null && $this->user->identity->getTheme()) {
|
||||
} else if($this->user->identity !== NULL && $this->user->identity->getTheme()) {
|
||||
$theme = $this->user->identity->getTheme();
|
||||
}
|
||||
|
||||
|
|
|
@ -29,7 +29,7 @@ final class SearchPresenter extends OpenVKPresenter
|
|||
if($query != "")
|
||||
$this->assertUserLoggedIn();
|
||||
|
||||
// https://youtu.be/pSAWM5YuXx8
|
||||
# https://youtu.be/pSAWM5YuXx8
|
||||
|
||||
$repos = [ "groups" => "clubs", "users" => "users" ];
|
||||
$repo = $repos[$type] or $this->throwError(400, "Bad Request", "Invalid search entity $type.");
|
||||
|
|
|
@ -91,7 +91,7 @@ final class TopicsPresenter extends OpenVKPresenter
|
|||
$topic->setFlags($flags);
|
||||
$topic->save();
|
||||
|
||||
// TODO move to trait
|
||||
# TODO move to trait
|
||||
try {
|
||||
$photo = NULL;
|
||||
$video = NULL;
|
||||
|
|
|
@ -360,7 +360,7 @@ final class UserPresenter extends OpenVKPresenter
|
|||
}
|
||||
|
||||
try {
|
||||
$user->setEmail($this->postParam("new_email"));
|
||||
$user->changeEmail($this->postParam("new_email"));
|
||||
} catch(UniqueConstraintViolationException $ex) {
|
||||
$this->flashFail("err", tr("error"), tr("user_already_exists"));
|
||||
}
|
||||
|
@ -507,7 +507,7 @@ final class UserPresenter extends OpenVKPresenter
|
|||
$this->template->secret = $secret;
|
||||
}
|
||||
|
||||
// Why are these crutch? For some reason, the QR code is not displayed if you just pass the render output to the view
|
||||
# Why are these crutch? For some reason, the QR code is not displayed if you just pass the render output to the view
|
||||
|
||||
$issuer = OPENVK_ROOT_CONF["openvk"]["appearance"]["name"];
|
||||
$email = $this->user->identity->getEmail();
|
||||
|
@ -639,7 +639,7 @@ final class UserPresenter extends OpenVKPresenter
|
|||
$request->delete(false);
|
||||
|
||||
try {
|
||||
$request->getUser()->setEmail($request->getNewEmail());
|
||||
$request->getUser()->changeEmail($request->getNewEmail());
|
||||
} catch(UniqueConstraintViolationException $ex) {
|
||||
$this->flashFail("err", tr("error"), tr("user_already_exists"));
|
||||
}
|
||||
|
|
|
@ -414,7 +414,7 @@ final class WallPresenter extends OpenVKPresenter
|
|||
$post->unpin();
|
||||
}
|
||||
|
||||
// TODO localize message based on language and ?act=(un)pin
|
||||
# TODO localize message based on language and ?act=(un)pin
|
||||
$this->flashFail("succ", tr("information_-1"), tr("changes_saved_comment"));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
{script "js/l10n.js"}
|
||||
{script "js/openvk.cls.js"}
|
||||
|
||||
{if $isTimezoned == null}
|
||||
{if $isTimezoned == NULL}
|
||||
{script "js/timezone.js"}
|
||||
{/if}
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
|||
{css "css/nsfw-posts.css"}
|
||||
{/if}
|
||||
|
||||
{if $theme !== null}
|
||||
{if $theme !== NULL}
|
||||
{if $theme->inheritDefault()}
|
||||
{css "css/style.css"}
|
||||
{css "css/dialog.css"}
|
||||
|
@ -275,6 +275,8 @@
|
|||
</p>
|
||||
</div>
|
||||
|
||||
{include "components/cookies.xml"}
|
||||
|
||||
{script "js/node_modules/msgpack-lite/dist/msgpack.min.js"}
|
||||
{script "js/node_modules/soundjs/lib/soundjs.min.js"}
|
||||
{script "js/node_modules/ky/umd.js"}
|
||||
|
|
35
Web/Presenters/templates/components/cookies.xml
Normal file
35
Web/Presenters/templates/components/cookies.xml
Normal file
|
@ -0,0 +1,35 @@
|
|||
<div class="cookies-popup" style="display: none;">
|
||||
<div class="contanier">
|
||||
<div class="text">
|
||||
{tr("cookies_popup_content")|noescape}
|
||||
</div>
|
||||
<div class="buttons">
|
||||
<a href="javascript:agreeWithCookies()" class="button">
|
||||
{_cookies_popup_agree}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
let cookie = decodeURIComponent(document.cookie).split(";");
|
||||
let cookiesAgreed = false;
|
||||
for(let i = 0; i < cookie.length; i++) {
|
||||
let c = cookie[i];
|
||||
while (c.charAt(0) == ' ') {
|
||||
c = c.substring(1);
|
||||
}
|
||||
if(c == "cookiesAgreed=true") {
|
||||
cookiesAgreed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(!cookiesAgreed) {
|
||||
u(".cookies-popup").nodes[0].style.display = "block";
|
||||
}
|
||||
|
||||
function agreeWithCookies() {
|
||||
document.cookie = "cookiesAgreed=true";
|
||||
u(".cookies-popup").nodes[0].style.display = "none";
|
||||
}
|
||||
</script>
|
|
@ -2,7 +2,7 @@
|
|||
{var $comments = $post->getLastComments(3)}
|
||||
{var $commentsCount = $post->getCommentsCount()}
|
||||
|
||||
{var $commentTextAreaId = $post === null ? rand(1,300) : $post->getId()}
|
||||
{var $commentTextAreaId = $post === NULL ? rand(1,300) : $post->getId()}
|
||||
|
||||
<table border="0" style="font-size: 11px;" n:class="post, !$compact ? post-divider, $post->isExplicit() ? post-nsfw">
|
||||
<tbody>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
{php if(!isset($GLOBALS["textAreaCtr"])) $GLOBALS["textAreaCtr"] = 10;}
|
||||
{var $textAreaId = ($post ?? NULL) === null ? (++$GLOBALS["textAreaCtr"]) : $post->getId()}
|
||||
{var $textAreaId = ($post ?? NULL) === NULL ? (++$GLOBALS["textAreaCtr"]) : $post->getId()}
|
||||
|
||||
<div id="write" style="padding: 5px 0;" onfocusin="expand_wall_textarea({$textAreaId});">
|
||||
<form action="{$route}" method="post" enctype="multipart/form-data" style="margin:0;">
|
||||
|
|
|
@ -1914,3 +1914,24 @@ table td[width="120"] {
|
|||
text-align: center;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.cookies-popup {
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
background: linear-gradient(#fff, #eee);
|
||||
box-shadow: inset 0px 1px 0px #bbb, inset 0px 2px 0px #ddd;
|
||||
}
|
||||
|
||||
.cookies-popup .contanier {
|
||||
width: 760px;
|
||||
display: flex;
|
||||
margin: 0 auto;
|
||||
align-items: center;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.cookies-popup .contanier .text {
|
||||
width: 100%;
|
||||
}
|
||||
|
|
|
@ -136,7 +136,7 @@ function isLanguageAvailable($lg): bool
|
|||
|
||||
function getBrowsersLanguage(): array
|
||||
{
|
||||
if ($_SERVER['HTTP_ACCEPT_LANGUAGE'] != null) return mb_split(",", mb_split(";", $_SERVER['HTTP_ACCEPT_LANGUAGE'])[0]);
|
||||
if ($_SERVER['HTTP_ACCEPT_LANGUAGE'] != NULL) return mb_split(",", mb_split(";", $_SERVER['HTTP_ACCEPT_LANGUAGE'])[0]);
|
||||
else return array();
|
||||
}
|
||||
|
||||
|
@ -144,7 +144,7 @@ function eventdb(): ?DatabaseConnection
|
|||
{
|
||||
$conf = OPENVK_ROOT_CONF["openvk"]["credentials"]["eventDB"];
|
||||
if(!$conf["enable"])
|
||||
return null;
|
||||
return NULL;
|
||||
|
||||
$db = (object) $conf["database"];
|
||||
return DatabaseConnection::connect([
|
||||
|
@ -216,8 +216,8 @@ return (function() {
|
|||
|
||||
setlocale(LC_TIME, "POSIX");
|
||||
|
||||
// TODO: Default language in config
|
||||
if(Session::i()->get("lang") == null) {
|
||||
# TODO: Default language in config
|
||||
if(Session::i()->get("lang") == NULL) {
|
||||
$languages = array_reverse(getBrowsersLanguage());
|
||||
foreach($languages as $lg) {
|
||||
if(isLanguageAvailable($lg)) setLanguage($lg);
|
||||
|
@ -233,7 +233,7 @@ return (function() {
|
|||
else
|
||||
$ver = "Public Technical Preview 3";
|
||||
|
||||
// Unix time constants
|
||||
# Unix time constants
|
||||
define('MINUTE', 60);
|
||||
define('HOUR', 60 * MINUTE);
|
||||
define('DAY', 24 * HOUR);
|
||||
|
|
|
@ -470,3 +470,7 @@
|
|||
"comment" = "Каментарый";
|
||||
"sender" = "Адпраўнік";
|
||||
|
||||
/* Cookies pop-up */
|
||||
|
||||
"cookies_popup_content" = "Усе хлопчыкi любяць пэчыва, таму гэты вэб-сайт выкарыстоўвае Cookies для таго, каб ідэнтыфікаваць вашу сесію і нічога болей. Звяртайцеся да нашай <a href='/privacy'>палiтыкi канфiдэнцыальнастi</a> для палучэння поўнай iнфармацыi.";
|
||||
"cookies_popup_agree" = "Прынiмаю";
|
||||
|
|
|
@ -977,3 +977,8 @@
|
|||
/* User alerts */
|
||||
|
||||
"user_alert_scam" = "This account has been reported a lot for scam. Please be careful, especially if he asked for money.";
|
||||
|
||||
/* Cookies pop-up */
|
||||
|
||||
"cookies_popup_content" = "All kids love cookies, so this website uses cookies to identify you and nothing more. Check <a href='/privacy'>our privacy policy</a> for more information.";
|
||||
"cookies_popup_agree" = "Accept";
|
||||
|
|
|
@ -1028,3 +1028,8 @@
|
|||
/* User alerts */
|
||||
|
||||
"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег.";
|
||||
|
||||
/* Cookies pop-up */
|
||||
|
||||
"cookies_popup_content" = "Все дети любят печенье, поэтому этот веб-сайт использует Cookies для того, чтобы идентифицировать вашу сессию и ничего более. Ознакомьтесь с нашей <a href='/privacy'>политикой конфиденциальности</a> для получения дополнительной информации.";
|
||||
"cookies_popup_agree" = "Согласен";
|
||||
|
|
Loading…
Reference in a new issue