From 2cef77a7f27ee4b7ed06a665da9d3fc5041c5875 Mon Sep 17 00:00:00 2001 From: xiaomlove Date: Sat, 7 Jan 2023 19:34:59 +0800 Subject: [PATCH] change user class migrate to admin --- .../User/UserResource/Pages/UserProfile.php | 31 +++++++++++++++++ app/Repositories/UserRepository.php | 33 +++++++++++++++++++ include/functions.php | 19 +++++++---- public/modtask.php | 23 ++++++------- public/userdetails.php | 4 +-- resources/lang/en/admin.php | 1 + resources/lang/en/user.php | 11 ++++++- resources/lang/zh_CN/admin.php | 1 + resources/lang/zh_CN/user.php | 9 +++++ resources/lang/zh_TW/admin.php | 1 + resources/lang/zh_TW/user.php | 9 +++++ 11 files changed, 122 insertions(+), 20 deletions(-) diff --git a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php index c1f89c58..535224b3 100644 --- a/app/Filament/Resources/User/UserResource/Pages/UserProfile.php +++ b/app/Filament/Resources/User/UserResource/Pages/UserProfile.php @@ -67,6 +67,9 @@ class UserProfile extends ViewRecord $actions[] = $this->buildResetPasswordAction(); $actions[] = $this->buildEnableDisableAction(); $actions[] = $this->buildEnableDisableDownloadPrivilegesAction(); + if (user_can('user-change-class')) { + $actions[] = $this->buildChangeClassAction(); + } if (user_can('user-delete')) { $actions[] = $this->buildDeleteAction(); } @@ -355,4 +358,32 @@ class UserProfile extends ViewRecord ->where('expired_at', '>', Carbon::now()) ->count(); } + + private function buildChangeClassAction(): Actions\Action + { + return Actions\Action::make('change_class') + ->label(__('admin.resources.user.actions.change_class_btn')) + ->form([ + Forms\Components\Select::make('class') + ->options(User::listClass()) + ->default($this->record->class) + ->label(__('user.labels.class')) + ->required() + , + Forms\Components\TextInput::make('reason') + ->label(__('admin.resources.user.actions.enable_disable_reason')) + ->placeholder(__('admin.resources.user.actions.enable_disable_reason_placeholder')) + , + ]) + ->action(function ($data) { + $userRep = $this->getRep(); + try { + $userRep->changeClass(Auth::user(), $this->record, $data['class'], $data['reason']); + $this->notify('success', 'Success!'); + $this->emitSelf(self::EVENT_RECORD_UPDATED, $this->record->id); + } catch (\Exception $exception) { + $this->notify('danger', $exception->getMessage()); + } + }); + } } diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index dc8670ea..7be17e2c 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -466,6 +466,39 @@ class UserRepository extends BaseRepository return true; } + public function changeClass($operator, $targetUser, $newClass, $reason = ''): bool + { + user_can('user-change-class', true); + $operator = $this->getUser($operator); + $targetUser = $this->getUser($targetUser); + if ($targetUser->class == $newClass) { + return true; + } + $locale = $targetUser->locale; + $subject = nexus_trans('user.edit_notifications.change_class.subject', [], $locale); + $body = nexus_trans('user.edit_notifications.change_class.body', [ + 'action' => nexus_trans( 'user.edit_notifications.change_class.' . ($newClass > $targetUser->class ? 'promote' : 'demote')), + 'new_class' => User::getClassText($newClass), + 'operator' => $operator->username ?? '', + 'reason' => $reason, + ], $locale); + $message = [ + 'sender' => 0, + 'receiver' => $targetUser->id, + 'subject' => $subject, + 'msg' => $body, + 'added' => Carbon::now(), + ]; + + NexusDB::transaction(function () use ($targetUser, $newClass, $message) { + $modComment = date('Y-m-d') . " - " . $message['msg']; + $targetUser->updateWithModComment(['class' => $newClass], $modComment); + Message::add($message); + }); + + return true; + } + public function addMeta($user, array $metaData, array $keyExistsUpdates = [], $notify = true) { $user = $this->getUser($user); diff --git a/include/functions.php b/include/functions.php index aad24eeb..508a0a41 100644 --- a/include/functions.php +++ b/include/functions.php @@ -1730,13 +1730,15 @@ function check_code ($imagehash, $imagestring, $where = 'signup.php',$maxattempt return true; } $query = sprintf("SELECT * FROM regimages WHERE imagehash='%s' AND imagestring='%s'", - mysql_real_escape_string($imagehash), - mysql_real_escape_string($imagestring)); + mysql_real_escape_string((string)$imagehash), + mysql_real_escape_string((string)$imagestring) + ); $sql = sql_query($query); $imgcheck = mysql_fetch_array($sql); if(!$imgcheck['dateline']) { $delete = sprintf("DELETE FROM regimages WHERE imagehash='%s'", - mysql_real_escape_string($imagehash)); + mysql_real_escape_string((string)$imagehash) + ); sql_query($delete); if (!$maxattemptlog) stderr('Error',$lang_functions['std_invalid_image_code']."".$lang_functions['std_here_to_request_new'], false); @@ -1744,7 +1746,8 @@ function check_code ($imagehash, $imagestring, $where = 'signup.php',$maxattempt failedlogins($lang_functions['std_invalid_image_code']."".$lang_functions['std_here_to_request_new'],true,$head); }else{ $delete = sprintf("DELETE FROM regimages WHERE imagehash='%s'", - mysql_real_escape_string($imagehash)); + mysql_real_escape_string((string)$imagehash) + ); sql_query($delete); return true; } @@ -4271,9 +4274,13 @@ function getSmileIt($formname, $taname, $smilyNumber) { return "\'\'")."', 'trail', false, 'delay', 0,'lifetime',10000,'styleClass','smilies','maxWidth', 400);\">\"\""; } -function classlist($selectname,$maxclass, $selected, $minClass = 0, $includeNoClass = false){ +function classlist($selectname,$maxclass, $selected, $minClass = 0, $includeNoClass = false, $disabled = false){ global $lang_functions; - $list = ""; if ($includeNoClass) { $list .= sprintf('', \App\Models\Setting::PERMISSION_NO_CLASS, $lang_functions['select_an_user_class']); } diff --git a/public/modtask.php b/public/modtask.php index 5d4202c2..572d0a0e 100644 --- a/public/modtask.php +++ b/public/modtask.php @@ -206,17 +206,18 @@ if ($action == "edituser") if ($curclass >= get_user_class()) puke(); - if (user_can('user-change-class') && $curclass != $class) - { - $what = ($class > $curclass ? $lang_modtask_target[get_user_lang($userid)]['msg_promoted'] : $lang_modtask_target[get_user_lang($userid)]['msg_demoted']); - $subject = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_class_change']); - $msg = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_you_have_been'].$what.$lang_modtask_target[get_user_lang($userid)]['msg_to'] . get_user_class_name($class) .$lang_modtask_target[get_user_lang($userid)]['msg_by'].$CURUSER['username']); - $added = sqlesc(date("Y-m-d H:i:s")); - sql_query("INSERT INTO messages (sender, receiver, subject, msg, added) VALUES(0, $userid, $subject, $msg, $added)") or sqlerr(__FILE__, __LINE__); - $updateset[] = "class = $class"; - $what = ($class > $curclass ? "Promoted" : "Demoted"); - $modcomment = date("Y-m-d") . " - $what to '" . get_user_class_name($class) . "' by {$CURUSER['username']}.\n". $modcomment; - } + //migrate to management +// if (user_can('user-change-class') && $curclass != $class) +// { +// $what = ($class > $curclass ? $lang_modtask_target[get_user_lang($userid)]['msg_promoted'] : $lang_modtask_target[get_user_lang($userid)]['msg_demoted']); +// $subject = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_class_change']); +// $msg = sqlesc($lang_modtask_target[get_user_lang($userid)]['msg_you_have_been'].$what.$lang_modtask_target[get_user_lang($userid)]['msg_to'] . get_user_class_name($class) .$lang_modtask_target[get_user_lang($userid)]['msg_by'].$CURUSER['username']); +// $added = sqlesc(date("Y-m-d H:i:s")); +// sql_query("INSERT INTO messages (sender, receiver, subject, msg, added) VALUES(0, $userid, $subject, $msg, $added)") or sqlerr(__FILE__, __LINE__); +// $updateset[] = "class = $class"; +// $what = ($class > $curclass ? "Promoted" : "Demoted"); +// $modcomment = date("Y-m-d") . " - $what to '" . get_user_class_name($class) . "' by {$CURUSER['username']}.\n". $modcomment; +// } if ($class == UC_VIP) { $updateset[] = "vip_added = ".sqlesc($vip_added); diff --git a/public/userdetails.php b/public/userdetails.php index 3c5fc791..5b1b19c1 100644 --- a/public/userdetails.php +++ b/public/userdetails.php @@ -474,8 +474,8 @@ if (user_can('prfmanage') && $user["class"] < get_user_class()) } if (user_can('user-change-class')) { $maxclass = get_user_class() - 1; - $classselect=classlist('class', $maxclass, $user["class"]); - tr($lang_userdetails['row_class'], $classselect, 1); + $classselect=classlist('class', $maxclass, $user["class"], 0, false, true); + tr($lang_userdetails['row_class'], $classselect . $migratedHelp, 1); } tr($lang_userdetails['row_vip_by_bonus'], "".$lang_userdetails['radio_yes']." ".$lang_userdetails['radio_no']."
".$lang_userdetails['text_vip_by_bonus_note'], 1); tr($lang_userdetails['row_vip_until'], " ".$lang_userdetails['text_vip_until_note'], 1); diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index ec1000d5..ecc9d234 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -79,6 +79,7 @@ return [ 'confirm_bulk' => 'Bulk confirm', 'change_bonus_etc_duration_label' => 'Duration', 'change_bonus_etc_duration_help' => 'Required when adding temporary invitation, in days', + 'change_class_btn' => 'Change class', ] ], 'exam_user' => [ diff --git a/resources/lang/en/user.php b/resources/lang/en/user.php index 73227f5a..b9721e06 100644 --- a/resources/lang/en/user.php +++ b/resources/lang/en/user.php @@ -16,6 +16,7 @@ return [ 'invites' => 'Invites', 'attendance_card' => 'Attend card', 'props' => 'Props', + 'class' => 'Class', ], 'class_names' => [ \App\Models\User::CLASS_VIP => 'Vip', @@ -39,6 +40,14 @@ return [ 'body' => ':operator Grant you :name, Validity period: :duration.', ], 'metas' => [ - 'already_valid_forever' => ':meta_key_text 已經永久有效', + 'already_valid_forever' => ':meta_key_text already valid forever', + ], + 'edit_notifications' => [ + 'change_class' => [ + 'promote' => 'Promote', + 'demote' => 'Demote', + 'subject' => 'Class changed', + 'body' => 'You had been :action to :new_class, administrator: :operator, reason: :reason.', + ], ], ]; diff --git a/resources/lang/zh_CN/admin.php b/resources/lang/zh_CN/admin.php index 3a4a4024..0e33fd96 100644 --- a/resources/lang/zh_CN/admin.php +++ b/resources/lang/zh_CN/admin.php @@ -77,6 +77,7 @@ return [ 'confirm_bulk' => '批量确认', 'change_bonus_etc_duration_label' => '有效期', 'change_bonus_etc_duration_help' => '增加临时邀请时必须,单位:天', + 'change_class_btn' => '修改等级', ] ], 'exam_user' => [ diff --git a/resources/lang/zh_CN/user.php b/resources/lang/zh_CN/user.php index 1d9b3b61..b730cff2 100644 --- a/resources/lang/zh_CN/user.php +++ b/resources/lang/zh_CN/user.php @@ -16,6 +16,7 @@ return [ 'invites' => '邀请', 'attendance_card' => '补签卡', 'props' => '道具', + 'class' => '等级', ], 'class_names' => [ \App\Models\User::CLASS_VIP => '贵宾', @@ -41,4 +42,12 @@ return [ 'metas' => [ 'already_valid_forever' => ':meta_key_text already valid forever', ], + 'edit_notifications' => [ + 'change_class' => [ + 'promote' => '提升', + 'demote' => '降级', + 'subject' => '等级变化', + 'body' => '你被:action为:new_class,管理员::operator, 原因::reason。', + ], + ], ]; diff --git a/resources/lang/zh_TW/admin.php b/resources/lang/zh_TW/admin.php index 6f95043c..8c8e60b6 100644 --- a/resources/lang/zh_TW/admin.php +++ b/resources/lang/zh_TW/admin.php @@ -79,6 +79,7 @@ return [ 'confirm_bulk' => '批量確認', 'change_bonus_etc_duration_label' => '有效期', 'change_bonus_etc_duration_help' => '增加臨時邀請時必須,單位:天', + 'change_class_btn' => '修改等級', ] ], 'exam_user' => [ diff --git a/resources/lang/zh_TW/user.php b/resources/lang/zh_TW/user.php index a5414a4c..b16206e7 100644 --- a/resources/lang/zh_TW/user.php +++ b/resources/lang/zh_TW/user.php @@ -16,6 +16,7 @@ return [ 'invites' => '邀請', 'attendance_card' => '補簽卡', 'props' => '道具', + 'class' => '等級', ], 'class_names' => [ \App\Models\User::CLASS_VIP => '貴賓', @@ -41,4 +42,12 @@ return [ 'metas' => [ 'already_valid_forever' => ':meta_key_text 已經永久有效', ], + 'edit_notifications' => [ + 'change_class' => [ + 'promote' => '提升', + 'demote' => '降級', + 'subject' => '等級變化', + 'body' => '你被:action為:new_class,管理員::operator, 原因::reason。', + ], + ], ];