finish plugin: sticky promotion

This commit is contained in:
xiaomlove
2022-06-08 14:15:59 +08:00
parent 44c750234a
commit 09f6e5b274
62 changed files with 954 additions and 178 deletions
+5 -3
View File
@@ -40,6 +40,7 @@ use League\Flysystem\StorageAttributes;
use Nexus\Database\NexusDB;
use Nexus\Imdb\Imdb;
use NexusPlugin\PostLike\PostLike;
use NexusPlugin\StickyPromotion\Models\StickyPromotion;
use Rhilip\Bencode\Bencode;
class Test extends Command
@@ -75,9 +76,10 @@ class Test extends Command
*/
public function handle()
{
$postLike = new PostLike();
$postLike->install();
// $postLike->uninstall();
$torrent = Torrent::query()->find(2);
$torrent = apply_filter('torrent_detail', $torrent);
$user = \App\Models\User::query()->find(10001);
do_action('announced', $torrent->toArray(), $user->toArray());
}
+1
View File
@@ -53,4 +53,5 @@ class Controller extends BaseController
}
return Str::slug("$title.$action", '.');
}
}
+2
View File
@@ -15,11 +15,13 @@ class BonusLogs extends NexusModel
const BUSINESS_TYPE_CANCEL_HIT_AND_RUN = 1;
const BUSINESS_TYPE_BUY_MEDAL = 2;
const BUSINESS_TYPE_BUY_ATTENDANCE_CARD = 3;
const BUSINESS_TYPE_STICKY_PROMOTION = 4;
public static array $businessTypes = [
self::BUSINESS_TYPE_CANCEL_HIT_AND_RUN => ['text' => 'Cancel H&R'],
self::BUSINESS_TYPE_BUY_MEDAL => ['text' => 'Buy medal'],
self::BUSINESS_TYPE_BUY_ATTENDANCE_CARD => ['text' => 'Buy attendance card'],
self::BUSINESS_TYPE_STICKY_PROMOTION => ['text' => 'Buy torrent sticky promotion'],
];
public static function getBonusForCancelHitAndRun()
+25
View File
@@ -3,6 +3,7 @@
namespace App\Models;
use App\Repositories\TagRepository;
use Illuminate\Database\Eloquent\Casts\Attribute;
use JeroenG\Explorer\Application\Explored;
use Laravel\Scout\Searchable;
@@ -27,6 +28,7 @@ class Torrent extends NexusModel
protected $casts = [
'added' => 'datetime',
'pt_gen' => 'array',
'promotion_until' => 'datetime',
];
public static $commentFields = [
@@ -156,6 +158,10 @@ class Torrent extends NexusModel
$spState = $this->sp_state;
$global = self::getGlobalPromotionState();
$log = sprintf('torrent: %s sp_state: %s, global sp state: %s', $this->id, $spState, $global);
if ($this->__ignore_global_sp_state) {
$log .= "[IGNORE_GLOBAL_SP_STATE]";
$global = self::PROMOTION_NORMAL;
}
if ($global != self::PROMOTION_NORMAL) {
$spState = $global;
$log .= sprintf(", global != %s, set sp_state to global: %s", self::PROMOTION_NORMAL, $global);
@@ -168,6 +174,13 @@ class Torrent extends NexusModel
return $spState;
}
public function posStateText(): Attribute
{
return new Attribute(
get: fn($value, $attributes) => nexus_trans('torrent.pos_state_' . $attributes['pos_state'])
);
}
public static function getGlobalPromotionState()
{
if (is_null(self::$globalPromotionState)) {
@@ -180,6 +193,18 @@ class Torrent extends NexusModel
return self::$globalPromotionState;
}
public static function getFieldsForList($appendTableName = false): array|bool
{
$fields = 'id, sp_state, promotion_time_type, promotion_until, banned, picktype, pos_state, category, source, medium, codec, standard, processing, team, audiocodec, leechers, seeders, name, small_descr, times_completed, size, added, comments,anonymous,owner,url,cache_stamp, pt_gen, hr';
$fields = preg_split('/[,\s]+/', $fields);
if ($appendTableName) {
foreach ($fields as &$value) {
$value = "torrents." . $value;
}
}
return $fields;
}
public function getHrAttribute(): string
{
$hrMode = Setting::get('hr.mode');
+12 -5
View File
@@ -11,6 +11,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\DB;
use Laravel\Sanctum\HasApiTokens;
use Nexus\Database\NexusDB;
class User extends Authenticatable
{
@@ -127,6 +128,7 @@ class User extends Authenticatable
protected $fillable = [
'username', 'email', 'passhash', 'secret', 'stylesheet', 'editsecret', 'added', 'modcomment', 'enabled', 'status',
'leechwarn', 'leechwarnuntil', 'page', 'class', 'uploaded', 'downloaded', 'clientselect', 'showclienterror', 'last_home',
'seedbonus', 'bonuscomment',
];
/**
@@ -396,15 +398,20 @@ class User extends Authenticatable
}
public function updateWithModComment(array $update, $modComment): bool
{
return $this->updateWithComment($update, $modComment, 'modcomment');
}
public function updateWithComment(array $update, $comment, $commentField): bool
{
if (!$this->exists) {
throw new \RuntimeException('This method only works when user exists!');
throw new \RuntimeException('This method only works when user exists !');
}
//@todo how to do prepare bindings here ?
$modComment = addslashes($modComment);
$update['modcomment'] = DB::raw("concat_ws('\n', '$modComment', modcomment)");
do_log("update: " . json_encode($update) . ", modcomment: $modComment", 'notice');
return $this->update($update);
$comment = addslashes($comment);
do_log("update: " . json_encode($update) . ", $commentField: $comment", 'notice');
$update[$commentField] = NexusDB::raw("if($commentField = '', '$comment', concat_ws('\n', '$comment', $commentField))");
return $this->update($update);
}
public function canAccessAdmin()
+7 -1
View File
@@ -23,6 +23,9 @@ class BonusRepository extends BaseRepository
if ($hitAndRun->uid != $uid) {
throw new \LogicException("H&R: $hitAndRunId not belongs to user: $uid.");
}
if ($hitAndRun->status == HitAndRun::STATUS_PARDONED) {
throw new \LogicException("H&R: $hitAndRunId already pardoned.");
}
$requireBonus = BonusLogs::getBonusForCancelHitAndRun();
NexusDB::transaction(function () use ($user, $hitAndRun, $requireBonus) {
$comment = nexus_trans('hr.bonus_cancel_comment', [
@@ -92,8 +95,11 @@ class BonusRepository extends BaseRepository
}
private function consumeUserBonus($user, $requireBonus, $logBusinessType, $logComment = '')
public function consumeUserBonus($user, $requireBonus, $logBusinessType, $logComment = '')
{
if ($requireBonus <= 0) {
return;
}
if ($user->seedbonus < $requireBonus) {
do_log("user: {$user->id}, bonus: {$user->seedbonus} < requireBonus: $requireBonus", 'error');
throw new \LogicException("User bonus point not enough.");
+12 -3
View File
@@ -110,7 +110,7 @@ class HitAndRunRepository extends BaseRepository
->with([
'torrent' => function ($query) {$query->select(['id', 'size', 'name']);},
'snatch',
'user' => function ($query) {$query->select(['id', 'username', 'lang', 'class', 'donoruntil']);},
'user' => function ($query) {$query->select(['id', 'username', 'lang', 'class', 'donoruntil', 'enabled']);},
'user.language',
]);
if (!is_null($uid)) {
@@ -309,6 +309,10 @@ class HitAndRunRepository extends BaseRepository
do_log("[DO_NOT_DISABLE_USER], return");
return true;
}
if ($hitAndRun->user->enabled == 'no') {
do_log("[USER_ALREADY_DISABLED], return");
return true;
}
//disable user
/** @var User $user */
$user = $hitAndRun->user;
@@ -370,7 +374,7 @@ class HitAndRunRepository extends BaseRepository
public function pardon($id, User $user): bool
{
$model = HitAndRun::query()->findOrFail($id);
if (!in_array($model->status, [HitAndRun::STATUS_INSPECTING, HitAndRun::STATUS_UNREACHED])) {
if (!in_array($model->status, $this->getCanPardonStatus())) {
throw new \LogicException("Can't be pardoned due to status is: " . $model->status_text . " !");
}
$model->status = HitAndRun::STATUS_PARDONED;
@@ -381,7 +385,7 @@ class HitAndRunRepository extends BaseRepository
public function bulkPardon(array $params, User $user): int
{
$query = $this->getBulkQuery($params)->where('status', HitAndRun::STATUS_INSPECTING);
$query = $this->getBulkQuery($params)->whereIn('status', $this->getCanPardonStatus());
$update = [
'status' => HitAndRun::STATUS_PARDONED,
'comment' => $this->getCommentUpdateRaw(addslashes('Pardon by ' . $user->username)),
@@ -398,4 +402,9 @@ class HitAndRunRepository extends BaseRepository
{
return DB::raw(sprintf("if (comment = '', '%s', concat('\n', '%s', comment))", $comment, $comment));
}
private function getCanPardonStatus(): array
{
return [HitAndRun::STATUS_INSPECTING, HitAndRun::STATUS_UNREACHED];
}
}
+3 -2
View File
@@ -676,10 +676,11 @@ class SearchRepository extends BaseRepository
foreach ($response['hits']['hits'] as $value) {
$torrentIdArr[] = $value['_source']['torrent_id'];
}
$fieldStr = 'id, sp_state, promotion_time_type, promotion_until, banned, picktype, pos_state, category, source, medium, codec, standard, processing, team, audiocodec, leechers, seeders, name, small_descr, times_completed, size, added, comments,anonymous,owner,url,cache_stamp, pt_gen, hr';
// $fieldStr = 'id, sp_state, promotion_time_type, promotion_until, banned, picktype, pos_state, category, source, medium, codec, standard, processing, team, audiocodec, leechers, seeders, name, small_descr, times_completed, size, added, comments,anonymous,owner,url,cache_stamp, pt_gen, hr';
$fields = Torrent::getFieldsForList();
$idStr = implode(',', $torrentIdArr);
$result['data'] = Torrent::query()
->selectRaw($fieldStr)
->select($fields)
->whereIn('id', $torrentIdArr)
->orderByRaw("field(id,$idStr)")
->get()
+12 -3
View File
@@ -15,6 +15,7 @@ use App\Models\Setting;
use App\Models\Snatch;
use App\Models\Torrent;
use App\Models\User;
use App\Models\UserBanLog;
use Carbon\Carbon;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
@@ -134,6 +135,9 @@ class TrackerRepository extends BaseRepository
}
}
$repDict = $this->generateSuccessAnnounceResponse($torrent, $queries, $user, $withPeers);
if ($isReAnnounce == self::ANNOUNCE_FIRST) {
do_action('announced', $torrent->toArray(), $user->toArray(), $queries);
}
} catch (ClientNotAllowedException $exception) {
do_log("[ClientNotAllowedException] " . $exception->getMessage());
if (isset($user) && $user->showclienterror == 'no') {
@@ -368,7 +372,7 @@ class TrackerRepository extends BaseRepository
return $user;
}
protected function checkTorrent($queries, User $user)
protected function checkTorrent($queries, User $user): Torrent
{
// Check Info Hash Against Torrents Table
$torrent = $this->getTorrentByInfoHash($queries['info_hash']);
@@ -381,8 +385,7 @@ class TrackerRepository extends BaseRepository
if ($torrent->banned == 'yes' && $user->class < Setting::get('authority.seebanned')) {
throw new TrackerException("torrent banned");
}
return $torrent;
return array_filter('torrent_detail', $torrent);
}
protected function checkPeer(Torrent $torrent, array $queries, User $user): void
@@ -518,6 +521,12 @@ class TrackerRepository extends BaseRepository
Cheater::query()->insert($data);
$modComment = "We believe you're trying to cheat. And your account is disabled.";
$user->updateWithModComment(['enabled' => User::ENABLED_NO], $modComment);
$userBanLog = [
'uid' => $user->id,
'username' => $user->username,
'reason' => "$comment(Upload speed:" . mksize($upSpeed) . "/s)"
];
UserBanLog::query()->insert($userBanLog);
throw new TrackerException($modComment);
}