22import os
33import time
44import json
5+ import re
56
67__all__ = ['CmdReposter' ]
78
@@ -25,6 +26,7 @@ def __init__(self, logger, core, config_file):
2526
2627 # connect signals and slots
2728 self .core .notifier .sig_input .connect (self .on_player_input )
29+ self .core .sig_server_output .connect (self .on_server_output )
2830
2931 # available commands
3032 self .cmd_available = {
@@ -34,6 +36,8 @@ def __init__(self, logger, core, config_file):
3436 }
3537
3638 self .tp_log = {}
39+ self .tps_asked = 0
40+ self .tps_asker = None
3741
3842 def server_say (self , text ):
3943 self .core .write_server ('/say {}' .format (text ))
@@ -44,6 +48,29 @@ def server_tell(self, player, text):
4448 def server_warn (self , player , text ):
4549 self .core .write_server ('/tellraw {} {}' .format (player .name , json .dumps ({'text' : text , 'color' : 'red' })))
4650
51+ def check_tp (self , line ):
52+ match_obj_1 = re .match (r'[^<>]*?\[Server thread/INFO\] \[minecraft/DedicatedServer\]: (.*)$' , line )
53+ text = match_obj_1 .group (1 ) if match_obj_1 else ''
54+ match_obj_2 = re .match (r'^Teleported (\w+)' , text )
55+ if match_obj_2 :
56+ # someone has been teleported
57+ player = match_obj_2 .group (1 )
58+ self .logger .debug ('CmdReposter.check_tp found player {} was teleported' .format (player ))
59+ self .tp_log [player ] = time .time () # record latest teleported time
60+
61+ def check_tps (self , line ):
62+ if self .tps_asked > 0 :
63+ self .logger .debug ('CmdReposter.tps_asked = {:d}' .format (self .tps_asked ))
64+ match_obj_1 = re .match (r'[^<>]*?\[Server thread/INFO\] \[minecraft/DedicatedServer\]: ([^<>]*)$' , line )
65+ if match_obj_1 :
66+ self .server_tell (self .tps_asker , match_obj_1 .group (1 ))
67+ self .tps_asked -= 1
68+
69+ def on_server_output (self , lines ):
70+ for line in lines :
71+ self .check_tp (line )
72+ self .check_tps (line )
73+
4774 def on_player_input (self , pair ):
4875 self .logger .debug ('CmdReposter.on_player_input called' )
4976 player = pair [0 ]
@@ -71,6 +98,9 @@ def on_player_input(self, pair):
7198 def tp_request (self , player , text_list ):
7299 self .logger .debug ('CmdReposter.tp_request called' )
73100
101+ if player .is_console ():
102+ return
103+
74104 if player .name not in self .tp_log :
75105 self .tp_log [player .name ] = 0
76106
@@ -82,10 +112,9 @@ def tp_request(self, player, text_list):
82112 cur_time = time .time ()
83113 if cur_time - self .tp_log [player .name ] < tp_cd :
84114 remain_sec = tp_cd - (cur_time - self .tp_log [player .name ])
115+ self .server_tell (player , 'Command tp is now cooling down!' )
85116 self .server_tell (player , 'You cannot use tp again until {:d} seconds later.' .format (int (remain_sec )))
86117 return
87- else :
88- self .tp_log [player .name ] = cur_time
89118
90119 args = text_list [1 :]
91120 tp_cmd = '/execute as {} at {} run tp {} ' .format (player .name , player .name , player .name )
@@ -100,10 +129,16 @@ def tp_request(self, player, text_list):
100129
101130 def ask_tps (self , player , text_list ):
102131 self .logger .debug ('CmdReposter.log_tps called' )
132+
133+ if player .is_console ():
134+ return
135+
103136 if len (text_list ) == 1 :
104137 if 'forge' not in self .configs or not self .configs ['forge' ]:
105138 return
106139 else :
107140 self .core .write_server ('/forge tps' )
141+ self .tps_asked = 4 # repost the next messages to player
142+ self .tps_asker = player
108143 else :
109144 self .server_tell (player , 'Command not acceptable. Please check again.' )
0 commit comments