1- import re
1+ from typing import Callable , Any , List , Union , Optional
22
3- from mcdreforged .api .types import CommandSource , PluginServerInterface
43from mcdreforged .api .command import *
5- from mcdreforged .api .utils import Serializable
64from mcdreforged .api .rtext import *
7- from typing import Callable , Any , List , Union , Optional
5+ from mcdreforged .api .types import CommandSource , PluginServerInterface
6+ from mcdreforged .api .utils import Serializable
87
9- from mcd_seen .storage import storage , PlayerSeen
10- from mcd_seen .constants import *
118from mcd_seen .config import config
12- from mcd_seen .utils import tr , delta_time , formatted_time , bot_name
9+ from mcd_seen .storage import storage , PlayerSeen
10+ from mcd_seen .utils import tr , delta_time , bot_name , psi , ntr , htr , fmt_time_tr
1311
1412TOP_OPTIONS = {
1513 '-bot' : 'bot' ,
@@ -36,7 +34,7 @@ def parse(cls, arg_string: Optional[str], liver: bool = False):
3634 data [mode ] = True
3735 args .remove (arg )
3836 data = cls .deserialize (data )
39- # Confict check
37+ # Conflict check
4038 if [data .all , data .merge , data .bot ].count (True ) > 1 or (data .full and liver ) or (len (args ) != 0 ):
4139 raise IllegalArgument (f'Illegal argument: { arg_string } ' , 1 )
4240 if liver and not data .get_all :
@@ -55,7 +53,12 @@ def text(self):
5553 ret .append (tr (f'text.top_{ o } ' ))
5654 if len (ret ) == 0 :
5755 ret .append (tr ('text.top_normal' ))
58- return '/' .join (ret ).strip ('/' )
56+ return RTextBase .join ('/' , ret )
57+
58+
59+ def reload_self (source : CommandSource ):
60+ psi .reload_plugin (psi .get_self_metadata ().id )
61+ source .reply (tr ('text.reloaded' ))
5962
6063
6164def register_command (server : PluginServerInterface ):
@@ -66,25 +69,31 @@ def exe(func: Union[Callable[[CommandSource, str], Any], Callable[[CommandSource
6669
6770 # !!seen
6871 server .register_command (
69- Literal (SEEN_PREFIX ).on_child_error (CommandError , cmd_error , handled = True ).runs (show_help ).then (
72+ Literal (config .seen_prefix ).on_child_error (
73+ CommandError , cmd_error , handled = True ).runs (show_help ).then (
74+ Literal ('reload' ).runs (reload_self )
75+ ).then (
7076 QuotableText ('player' ).runs (exe (seen ))
7177 )
7278 )
7379 # !!seen-top
7480 server .register_command (
75- Literal (SEEN_TOP_PREFIX ).on_child_error (CommandError , cmd_error , handled = True ).runs (exe (seen_top , True )).then (
81+ Literal (config .seen_top_prefix ).on_child_error (
82+ CommandError , cmd_error , handled = True ).runs (exe (seen_top , True )).then (
7683 GreedyText ('exarg' ).runs (exe (seen_top ))
7784 )
7885 )
7986 # !!liver
8087 server .register_command (
81- Literal (LIVER_TOP_PREFIX ).on_child_error (CommandError , cmd_error , handled = True ).runs (exe (liver_top , True )).then (
88+ Literal (config .liver_top_prefix ).on_child_error (
89+ CommandError , cmd_error , handled = True ).runs (exe (liver_top , True )).then (
8290 QuotableText ('exarg' ).runs (exe (liver_top ))
8391 )
8492 )
85- if DEBUG_MODE :
93+ if config . debug :
8694 server .register_command (
87- Literal (DEBUG_PREFIX ).requires (lambda src : src .has_permission (4 ), lambda : 'Permission denied' ).then (
95+ Literal (config .debug_prefix ).requires (
96+ lambda src : src .has_permission (4 ), lambda : 'Permission denied' ).then (
8897 Literal ('remove' ).then (
8998 GreedyText ('players' ).runs (exe (__remove_player_data ))
9099 )
@@ -93,49 +102,51 @@ def exe(func: Union[Callable[[CommandSource, str], Any], Callable[[CommandSource
93102
94103
95104def show_help (source : CommandSource ):
96- help_message = tr (
97- 'help_msg' , SEEN_PREFIX , SEEN_TOP_PREFIX , LIVER_TOP_PREFIX , META .name , str (META .version )
98- ).strip ().splitlines ()
99- help_msg_rtext = ''
100- for line in help_message :
101- if help_msg_rtext != '' :
102- help_msg_rtext += '\n '
103- for PREFIX in [SEEN_PREFIX , SEEN_TOP_PREFIX , LIVER_TOP_PREFIX ]:
104- result = re .search (r'(?<=§7){}[\S ]*?(?=§)' .format (PREFIX ), line )
105- if result is not None :
106- break
107- if result is not None :
108- cmd = result .group ().strip () + ' '
109- help_msg_rtext += RText (line ).c (RAction .suggest_command , cmd ).h (
110- tr ("hover.help_msg_suggest" , cmd .strip ()))
111- else :
112- help_msg_rtext += line
113- source .reply (help_msg_rtext )
105+ meta = psi .get_self_metadata ()
106+ msg = htr (
107+ 'help_msg' ,
108+ config .seen_prefix [0 ],
109+ config .seen_top_prefix [0 ],
110+ config .liver_top_prefix [0 ],
111+ meta .name ,
112+ str (meta .version )
113+ )
114+ source .reply (msg )
114115
115116
116117# Text layout
117118def top (top_players : List [PlayerSeen ], prefix : Union [RTextBase , str ]):
118- ret , num = RTextList ( prefix ) , 1
119+ ret , num = [ prefix ] , 1
119120 for p in top_players :
120- ret .append (f' \n { num } . ' , seen_format (p ))
121+ ret .append (RTextList ( f' { num } . ' , seen_format (p ) ))
121122 num += 1
122- return ret
123+ return RTextBase . join ( ' \n ' , ret )
123124
124125
125126def seen_format (player : PlayerSeen ):
126- ret = ''
127+ return tr ('text' , player = player ).set_translator (seen_fmt_tr )
128+
129+
130+ def seen_fmt_tr (translation_key : str , player : PlayerSeen , language : Optional [str ] = None , allow_failure : bool = True ):
131+ def ttr (key : str , * args , ** kwargs ):
132+ return ntr (f'{ translation_key } .{ key } ' , * args , language = language , allow_failure = allow_failure , ** kwargs )
133+ ret = []
127134 # Bot/Player
128- ret + = '§{}{}§e' . format ( ' 5' if player .is_bot else 'd' ,
129- tr ( f'text. { " bot" if player .is_bot else " player" } ' ).capitalize ())
135+ color = '§5' if player .is_bot else '§d'
136+ ret . append ( f" { color } { ttr ( ' bot' if player .is_bot else ' player' ).capitalize ()} §r" )
130137 # <player_name>
131- ret += f' §e{ player .actual_name } §r '
138+ ret . append ( f' §e{ player .actual_name } §r' )
132139 # has been online/offline for
133- ret += tr ( f'text. { " bot_liver" if player .is_bot else " player_liver" } ' ) if player .online else tr ( 'text. seen' )
140+ ret . append ( ttr ( ' bot_liver' if player .is_bot else ' player_liver' ) if player .online else ttr ( ' seen') )
134141 # sec min hrs day
135- ret += formatted_time (delta_time (player .target ))
136- return RText (ret ).h (tr ('hover.query_player' , player .actual_name )).c (
137- RAction .run_command , '{} {}' .format (SEEN_PREFIX , player .actual_name )
142+ ret .append (fmt_time_tr (
143+ 'mcd_seen.fmt.time_seen' , t = delta_time (player .target ), language = language , allow_failure = allow_failure ))
144+
145+ ret = ' ' .join (ret )
146+ ret = RText (ret ).h (tr ('hover.query_player' , player .actual_name )).c (
147+ RAction .run_command , '{} {}' .format (config .seen_prefix [0 ], player .actual_name )
138148 )
149+ return ret
139150
140151
141152def seen (source : CommandSource , player : str ):
@@ -163,7 +174,7 @@ def seen_top(source: CommandSource, exarg: str = None, liver: bool = False):
163174 # -full
164175 sorted_list = sorted_list if args .full else sorted_list [:config .seen_top_max ]
165176 # get prefix
166- prefix = tr (f'fmt.seen_top{ "_full" if args .full else "" } ' , config .seen_top_max , args .text )
177+ prefix = tr (f'fmt.seen_top{ "_full" if args .full else "" } ' , num = config .seen_top_max , arg = args .text )
167178 if liver :
168179 prefix = tr ('fmt.liver_top' , args .text )
169180
@@ -176,10 +187,8 @@ def liver_top(source: CommandSource, exarg: str = None):
176187
177188def cmd_error (source : CommandSource ):
178189 source .reply (
179- RText (
180- tr ('mcd_seen.error.cmd_error' ), color = RColor .red
181- ).c (
182- RAction .run_command , SEEN_PREFIX
190+ tr ('mcd_seen.error.cmd_error' ).set_color (color = RColor .red ).c (
191+ RAction .run_command , config .seen_prefix [0 ]
183192 ).h (
184193 tr ('mcd_seen.hover.show_help' )
185194 )
@@ -188,10 +197,8 @@ def cmd_error(source: CommandSource):
188197
189198def player_data_not_found (source : CommandSource ):
190199 source .reply (
191- RText (
192- tr ('mcd_seen.error.player_data_not_found' ), color = RColor .red
193- ).c (
194- RAction .run_command , SEEN_PREFIX
200+ tr ('mcd_seen.error.player_data_not_found' ).set_color (color = RColor .red ).c (
201+ RAction .run_command , config .seen_prefix [0 ]
195202 ).h (
196203 tr ('mcd_seen.hover.show_help' )
197204 )
0 commit comments