mirror of
https://github.com/openvk/openvk
synced 2025-04-23 16:43:02 +03:00
Add API for notifications
This commit is contained in:
parent
e433e46b36
commit
a0ffd0a9d7
9 changed files with 309 additions and 4 deletions
83
VKAPI/Handlers/Notifications.php
Normal file
83
VKAPI/Handlers/Notifications.php
Normal file
|
@ -0,0 +1,83 @@
|
||||||
|
<?php declare(strict_types=1);
|
||||||
|
namespace openvk\VKAPI\Handlers;
|
||||||
|
use openvk\Web\Models\Entities\Club;
|
||||||
|
use openvk\Web\Models\Repositories\{Notifications as Notifs, Clubs, Users};
|
||||||
|
|
||||||
|
final class Notifications extends VKAPIRequestHandler
|
||||||
|
{
|
||||||
|
function get(int $count = 10,
|
||||||
|
string $from = "",
|
||||||
|
int $offset = 0,
|
||||||
|
string $start_from = "",
|
||||||
|
string $filters = "",
|
||||||
|
int $start_time = 0,
|
||||||
|
int $end_time = 0,
|
||||||
|
int $archived = 0)
|
||||||
|
{
|
||||||
|
$this->requireUser();
|
||||||
|
|
||||||
|
$res = (object)[
|
||||||
|
"items" => [],
|
||||||
|
"profiles" => [],
|
||||||
|
"groups" => [],
|
||||||
|
"last_viewed" => $this->getUser()->getNotificationOffset()
|
||||||
|
];
|
||||||
|
|
||||||
|
if($count > 100)
|
||||||
|
$this->fail(125, "Count is too big");
|
||||||
|
|
||||||
|
if(!eventdb())
|
||||||
|
$this->fail(1289, "EventDB is disabled on this instance");
|
||||||
|
|
||||||
|
$notifs = array_slice(iterator_to_array((new Notifs)->getNotificationsByUser($this->getUser(), $this->getUser()->getNotificationOffset(), (bool)$archived, 1, $offset + $count)), $offset);
|
||||||
|
$tmpProfiles = [];
|
||||||
|
foreach($notifs as $notif) {
|
||||||
|
$sxModel = $notif->getModel(1);
|
||||||
|
|
||||||
|
if(!method_exists($sxModel, "getAvatarUrl"))
|
||||||
|
$sxModel = $notif->getModel(0);
|
||||||
|
|
||||||
|
|
||||||
|
$tmpProfiles[] = $sxModel instanceof Club ? $sxModel->getId() * -1 : $sxModel->getId();
|
||||||
|
$res->items[] = $notif->toVkApiStruct();
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach(array_unique($tmpProfiles) as $id) {
|
||||||
|
if($id > 0) {
|
||||||
|
$sxModel = (new Users)->get($id);
|
||||||
|
$result = (object)[
|
||||||
|
"uid" => $sxModel->getId(),
|
||||||
|
"first_name" => $sxModel->getFirstName(),
|
||||||
|
"last_name" => $sxModel->getLastName(),
|
||||||
|
"photo" => $sxModel->getAvatarUrl(),
|
||||||
|
"photo_medium_rec" => $sxModel->getAvatarUrl("tiny"),
|
||||||
|
"screen_name" => $sxModel->getShortCode()
|
||||||
|
];
|
||||||
|
|
||||||
|
$res->profiles[] = $result;
|
||||||
|
} else {
|
||||||
|
$sxModel = (new Clubs)->get(abs($id));
|
||||||
|
$result = $sxModel->toVkApiStruct($this->getUser());
|
||||||
|
|
||||||
|
$res->groups[] = $result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
|
function markAsViewed()
|
||||||
|
{
|
||||||
|
$this->requireUser();
|
||||||
|
$this->willExecuteWriteAction();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$this->getUser()->updateNotificationOffset();
|
||||||
|
$this->getUser()->save();
|
||||||
|
} catch(\Throwable $e) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,7 +1,8 @@
|
||||||
<?php declare(strict_types=1);
|
<?php declare(strict_types=1);
|
||||||
namespace openvk\VKAPI\Handlers;
|
namespace openvk\VKAPI\Handlers;
|
||||||
use openvk\Web\Models\Entities\User;
|
use openvk\Web\Models\Entities\{User, Report};
|
||||||
use openvk\Web\Models\Repositories\Users as UsersRepo;
|
use openvk\Web\Models\Repositories\Users as UsersRepo;
|
||||||
|
use openvk\Web\Models\Repositories\Reports;
|
||||||
|
|
||||||
final class Users extends VKAPIRequestHandler
|
final class Users extends VKAPIRequestHandler
|
||||||
{
|
{
|
||||||
|
@ -289,4 +290,26 @@ final class Users extends VKAPIRequestHandler
|
||||||
"items" => $this->get(implode(',', $array), $nfilds, $offset, $count)
|
"items" => $this->get(implode(',', $array), $nfilds, $offset, $count)
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function report(int $user_id, string $type = "spam", string $comment = "")
|
||||||
|
{
|
||||||
|
$this->requireUser();
|
||||||
|
$this->willExecuteWriteAction();
|
||||||
|
|
||||||
|
if($user_id == $this->getUser()->getId())
|
||||||
|
$this->fail(12, "Can't report yourself.");
|
||||||
|
|
||||||
|
if(sizeof(iterator_to_array((new Reports)->getDuplicates("user", $user_id, NULL, $this->getUser()->getId()))) > 0)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
$report = new Report;
|
||||||
|
$report->setUser_id($this->getUser()->getId());
|
||||||
|
$report->setTarget_id($user_id);
|
||||||
|
$report->setType("user");
|
||||||
|
$report->setReason($comment);
|
||||||
|
$report->setCreated(time());
|
||||||
|
$report->save();
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,7 @@ class Club extends RowModel
|
||||||
|
|
||||||
function toVkApiStruct(?User $user = NULL): object
|
function toVkApiStruct(?User $user = NULL): object
|
||||||
{
|
{
|
||||||
$res = [];
|
$res = (object) [];
|
||||||
|
|
||||||
$res->id = $this->getId();
|
$res->id = $this->getId();
|
||||||
$res->name = $this->getName();
|
$res->name = $this->getName();
|
||||||
|
@ -398,7 +398,7 @@ class Club extends RowModel
|
||||||
|
|
||||||
$res->can_post = $this->canBeModifiedBy($user) ? 1 : ($this->canPost() ? 1 : 0);
|
$res->can_post = $this->canBeModifiedBy($user) ? 1 : ($this->canPost() ? 1 : 0);
|
||||||
|
|
||||||
return (object) $res;
|
return $res;
|
||||||
}
|
}
|
||||||
|
|
||||||
use Traits\TBackDrops;
|
use Traits\TBackDrops;
|
||||||
|
|
|
@ -90,4 +90,17 @@ class Comment extends Post
|
||||||
{
|
{
|
||||||
return "/wall" . $this->getTarget()->getPrettyId() . "#_comment" . $this->getId();
|
return "/wall" . $this->getTarget()->getPrettyId() . "#_comment" . $this->getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toNotifApiStruct()
|
||||||
|
{
|
||||||
|
$res = (object)[];
|
||||||
|
|
||||||
|
$res->id = $this->getId();
|
||||||
|
$res->owner_id = $this->getOwner()->getId();
|
||||||
|
$res->date = $this->getPublicationTime()->timestamp();
|
||||||
|
$res->text = $this->getText(false);
|
||||||
|
$res->post = NULL; # todo
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ class Note extends Postable
|
||||||
$res->date = $this->getPublicationTime()->timestamp();
|
$res->date = $this->getPublicationTime()->timestamp();
|
||||||
$res->comments = $this->getCommentsCount();
|
$res->comments = $this->getCommentsCount();
|
||||||
$res->read_comments = $this->getCommentsCount();
|
$res->read_comments = $this->getCommentsCount();
|
||||||
$res->view_url = "/note".$this->getOwner()->getId()."_".$this->getId();
|
$res->view_url = "/note".$this->getOwner()->getId()."_".$this->getVirtualId();
|
||||||
$res->privacy_view = 1;
|
$res->privacy_view = 1;
|
||||||
$res->can_comment = 1;
|
$res->can_comment = 1;
|
||||||
$res->text_wiki = "r";
|
$res->text_wiki = "r";
|
||||||
|
|
|
@ -132,4 +132,138 @@ QUERY;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getVkApiInfo()
|
||||||
|
{
|
||||||
|
$origin_m = $this->encodeType($this->originModel);
|
||||||
|
$target_m = $this->encodeType($this->targetModel);
|
||||||
|
|
||||||
|
$info = [
|
||||||
|
"type" => "",
|
||||||
|
"parent" => NULL,
|
||||||
|
"feedback" => NULL,
|
||||||
|
];
|
||||||
|
|
||||||
|
switch($this->getActionCode()) {
|
||||||
|
case 0:
|
||||||
|
$info["type"] = "like_post";
|
||||||
|
$info["parent"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
$info["feedback"] = $this->getModel(1)->toVkApiStruct();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
$info["type"] = "copy_post";
|
||||||
|
$info["parent"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
$info["feedback"] = NULL; # todo
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
switch($origin_m) {
|
||||||
|
case 19:
|
||||||
|
$info["type"] = "comment_video";
|
||||||
|
$info["parent"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
$info["feedback"] = NULL; # айди коммента не сохраняется в бд( ну пиздец блять
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
$info["type"] = "comment_photo";
|
||||||
|
$info["parent"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
$info["feedback"] = NULL;
|
||||||
|
break;
|
||||||
|
# unstandart (vk forgor about notes)
|
||||||
|
case 10:
|
||||||
|
$info["type"] = "comment_note";
|
||||||
|
$info["parent"] = $this->getModel(0)->toVkApiStruct();
|
||||||
|
$info["feedback"] = NULL;
|
||||||
|
break;
|
||||||
|
case 14:
|
||||||
|
$info["type"] = "comment_post";
|
||||||
|
$info["parent"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
$info["feedback"] = NULL;
|
||||||
|
break;
|
||||||
|
# unused (users don't have topics bruh)
|
||||||
|
case 21:
|
||||||
|
$info["type"] = "comment_topic";
|
||||||
|
$info["parent"] = $this->getModel(0)->toVkApiStruct(0, 90);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$info["type"] = "comment_unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
$info["type"] = "wall";
|
||||||
|
$info["feedback"] = $this->getModel(0)->toNotifApiStruct();
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
switch($target_m) {
|
||||||
|
case 14:
|
||||||
|
$info["type"] = "mention";
|
||||||
|
$info["feedback"] = $this->getModel(1)->toNotifApiStruct();
|
||||||
|
break;
|
||||||
|
case 19:
|
||||||
|
$info["type"] = "mention_comment_video";
|
||||||
|
$info["parent"] = $this->getModel(1)->toNotifApiStruct();
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
|
$info["type"] = "mention_comment_photo";
|
||||||
|
$info["parent"] = $this->getModel(1)->toNotifApiStruct();
|
||||||
|
break;
|
||||||
|
# unstandart
|
||||||
|
case 10:
|
||||||
|
$info["type"] = "mention_comment_note";
|
||||||
|
$info["parent"] = $this->getModel(1)->toVkApiStruct();
|
||||||
|
break;
|
||||||
|
case 21:
|
||||||
|
$info["type"] = "mention_comments";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$info["type"] = "mention_comment_unknown";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
$info["type"] = "make_you_admin";
|
||||||
|
$info["parent"] = $this->getModel(0)->toVkApiStruct($this->getModel(1));
|
||||||
|
break;
|
||||||
|
# Нужно доделать после мержа #935
|
||||||
|
case 6:
|
||||||
|
$info["type"] = "wall_publish";
|
||||||
|
break;
|
||||||
|
# В вк не было такого уведомления, так что unstandart
|
||||||
|
case 7:
|
||||||
|
$info["type"] = "new_posts_in_club";
|
||||||
|
break;
|
||||||
|
# В вк при передаче подарков приходит сообщение, а не уведомление, так что unstandart
|
||||||
|
case 9601:
|
||||||
|
$info["type"] = "sent_gift";
|
||||||
|
$info["parent"] = $this->getModel(1)->toVkApiStruct($this->getModel(1));
|
||||||
|
break;
|
||||||
|
case 9602:
|
||||||
|
$info["type"] = "voices_transfer";
|
||||||
|
$info["parent"] = $this->getModel(1)->toVkApiStruct($this->getModel(1));
|
||||||
|
break;
|
||||||
|
case 9603:
|
||||||
|
$info["type"] = "up_rating";
|
||||||
|
$info["parent"] = $this->getModel(1)->toVkApiStruct($this->getModel(1));
|
||||||
|
$info["parent"]->count = $this->getData();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
$info["type"] = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $info;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVkApiStruct()
|
||||||
|
{
|
||||||
|
$res = (object)[];
|
||||||
|
|
||||||
|
$info = $this->getVkApiInfo();
|
||||||
|
$res->type = $info["type"];
|
||||||
|
$res->date = $this->getDateTime()->timestamp();
|
||||||
|
$res->parent = $info["parent"];
|
||||||
|
$res->feedback = $info["feedback"];
|
||||||
|
$res->reply = NULL; # Ответы на комментарии не реализованы
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -347,4 +347,20 @@ class Photo extends Media
|
||||||
|
|
||||||
return $photo;
|
return $photo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toNotifApiStruct()
|
||||||
|
{
|
||||||
|
$res = (object)[];
|
||||||
|
|
||||||
|
$res->id = $this->getVirtualId();
|
||||||
|
$res->owner_id = $this->getOwner()->getId();
|
||||||
|
$res->aid = 0;
|
||||||
|
$res->src = $this->getURLBySizeId("tiny");
|
||||||
|
$res->src_big = $this->getURLBySizeId("normal");
|
||||||
|
$res->src_small = $this->getURLBySizeId("miniscule");
|
||||||
|
$res->text = $this->getDescription();
|
||||||
|
$res->created = $this->getPublicationTime()->timestamp();
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,5 +246,22 @@ class Post extends Postable
|
||||||
$this->save();
|
$this->save();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toNotifApiStruct()
|
||||||
|
{
|
||||||
|
$res = (object)[];
|
||||||
|
|
||||||
|
$res->id = $this->getVirtualId();
|
||||||
|
$res->to_id = $this->getOwner() instanceof Club ? $this->getOwner()->getId() * -1 : $this->getOwner()->getId();
|
||||||
|
$res->from_id = $res->to_id;
|
||||||
|
$res->date = $this->getPublicationTime()->timestamp();
|
||||||
|
$res->text = $this->getText(false);
|
||||||
|
$res->attachments = []; # todo
|
||||||
|
|
||||||
|
$res->copy_owner_id = NULL; # todo
|
||||||
|
$res->copy_post_id = NULL; # todo
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
|
|
||||||
use Traits\TRichText;
|
use Traits\TRichText;
|
||||||
}
|
}
|
||||||
|
|
|
@ -219,4 +219,23 @@ class Video extends Media
|
||||||
|
|
||||||
return $video;
|
return $video;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function toNotifApiStruct()
|
||||||
|
{
|
||||||
|
$fromYoutube = $this->getType() == Video::TYPE_EMBED;
|
||||||
|
$res = (object)[];
|
||||||
|
|
||||||
|
$res->id = $this->getVirtualId();
|
||||||
|
$res->owner_id = $this->getOwner()->getId();
|
||||||
|
$res->title = $this->getName();
|
||||||
|
$res->description = $this->getDescription();
|
||||||
|
$res->duration = "22";
|
||||||
|
$res->link = "/video".$this->getOwner()->getId()."_".$this->getVirtualId();
|
||||||
|
$res->image = $this->getThumbnailURL();
|
||||||
|
$res->date = $this->getPublicationTime()->timestamp();
|
||||||
|
$res->views = 0;
|
||||||
|
$res->player = !$fromYoutube ? $this->getURL() : $this->getVideoDriver()->getURL();
|
||||||
|
|
||||||
|
return $res;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue