Merge from 'master' branch

This commit is contained in:
veselcraft 2022-05-23 15:27:29 +03:00
commit fd9107749d
No known key found for this signature in database
GPG key ID: AED66BC1AC628A4E
38 changed files with 460 additions and 100 deletions

11
CODE-OF-CONFLICT.md Normal file
View 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
View 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";
}
```

View file

@ -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
}
}

View file

@ -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) [

View file

@ -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)[

View file

@ -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:

View file

@ -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':

View file

@ -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);

View file

@ -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;
}

View file

@ -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;
}

View file

@ -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(),

View file

@ -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([

View file

@ -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;

View file

@ -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;

View file

@ -39,7 +39,7 @@ class Notes
if(!is_null($note))
return new Note($note);
else
return null;
return NULL;
}
function getUserNotesCount(User $user): int

View file

@ -96,7 +96,7 @@ class Posts
if(!is_null($post))
return new Post($post);
else
return null;
return NULL;
}

View file

@ -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
{

View file

@ -50,7 +50,7 @@ class Tickets
if(!is_null($requests))
return new Req($requests);
else
return null;
return NULL;
}

View file

@ -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;

View file

@ -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");

View file

@ -60,7 +60,7 @@ final class CommentPresenter extends OpenVKPresenter
}
}
// TODO move to trait
# TODO move to trait
try {
$photo = NULL;
$video = NULL;

View file

@ -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();

View file

@ -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 {

View file

@ -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");

View file

@ -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();
}

View file

@ -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.");

View file

@ -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;

View file

@ -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"));
}

View file

@ -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"));
}
}

View file

@ -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"}

View 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>

View file

@ -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>

View file

@ -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;">

View file

@ -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%;
}

View file

@ -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);

View file

@ -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маю";

View file

@ -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";

View file

@ -1028,3 +1028,8 @@
/* User alerts */
"user_alert_scam" = "На этот аккаунт много жаловались в связи с мошенничеством. Пожалуйста, будьте осторожны, особенно если у вас попросят денег.";
/* Cookies pop-up */
"cookies_popup_content" = "Все дети любят печенье, поэтому этот веб-сайт использует Cookies для того, чтобы идентифицировать вашу сессию и ничего более. Ознакомьтесь с нашей <a href='/privacy'>политикой конфиденциальности</a> для получения дополнительной информации.";
"cookies_popup_agree" = "Согласен";