Compare commits

...

2 Commits

Author SHA1 Message Date
37c0dc6701 Add default values 2023-11-24 00:55:14 +03:00
fbace37008 REFACTORING 2023-11-24 00:37:33 +03:00
2 changed files with 81 additions and 84 deletions

View File

@ -1,8 +1,8 @@
{ {
"rcon": { "rcon": {
"host": "", "host": "127.0.0.1",
"port": 0, "port": 25575,
"password": "" "password": "P@ssw0rd"
}, },
"vk": { "vk": {
"token": "", "token": "",

View File

@ -20,15 +20,22 @@ with open('config-t.json' if "-t" in sys.argv else 'config.json') as f:
with open('help_message.txt') as f: with open('help_message.txt') as f:
help_message = f.read() help_message = f.read()
vk = vk.API(access_token=config['vk']['token'], v=5.131)
group_id = vk.groups.getById()[0]['id']
log(f"Group id: {group_id}")
host = config['rcon']['host'] host = config['rcon']['host']
port = config['rcon']['port'] port = config['rcon']['port']
password = config['rcon']['password'] password = config['rcon']['password']
def rcon(cmd):
try:
with MCRcon(host, password, port) as mcr:
text = mcr.command(cmd)
return re.sub(r'§.', '', text)
except Exception as e:
log(f"RCON ERROR with command: {cmd}", 1)
print(traceback.format_exc())
return f"Rcon error: {e}"
class Permissions: class Permissions:
def __init__(self, permission_file): def __init__(self, permission_file):
@ -69,93 +76,83 @@ class Permissions:
return None return None
perms = Permissions(config['permission_file']) class Bot:
def __init__(self, perms: Permissions):
self.vk = vk.API(access_token=config['vk']['token'], v=5.131)
self.group_id = vk.groups.getById()[0]['id']
log(f"Group id: {self.group_id}")
self.perms = perms
def rcon(cmd): def get_lp_server(self):
try: lp = vk.groups.getLongPollServer(group_id=self.group_id)
with MCRcon(host, password, port) as mcr: return lp.get('server'), lp.get('key'), lp.get('ts')
text = mcr.command(cmd)
return re.sub(r'§.', '', text)
except Exception as e:
log(f"RCON ERROR with command: {cmd}", 1)
print(traceback.format_exc())
return f"Rcon error: {e}"
def write(self, peer_id, message):
def get_lp_server(): if len(message) > 4095:
lp = vk.groups.getLongPollServer(group_id=group_id) messages = (len(message) // 4095)
return lp.get('server'), lp.get('key'), lp.get('ts') for i in range(1, messages + 1):
if i > 30:
log("Found very long message...", 1)
def write(peer_id, message): break
if len(message) > 4095: self.write(peer_id, message[:4095 * i])
messages = (len(message) // 4095)
for i in range(1, messages + 1):
if i > 30:
log("Found very long message...", 1)
break
write(peer_id, message[:4095 * i])
else:
vk.messages.send(message=message, peer_id=peer_id, random_id=0)
def rcon_cmd_handle(cmd, from_id, peer_id, _write=True, _allow=False):
a, r = perms.is_allow(from_id, cmd.split()[0])
if _allow:
r = cmd
if a or _allow:
answer = rcon(cmd)
log(f"User: {from_id}({r}) in Chat: {peer_id} use RCON cmd: \"{cmd}\", with answer: \"{answer}\"")
if _write:
write(peer_id, f"RCON:\n{answer}")
else: else:
return answer vk.messages.send(message=message, peer_id=peer_id, random_id=0)
else:
log(f"User: {from_id}({r}) in Chat: {peer_id} no have rights RCON cmd: \"{cmd}\".")
def rcon_cmd_handle(self, cmd, from_id, peer_id, _write=True, _allow=False):
a, r = self.perms.is_allow(from_id, cmd.split()[0])
if _allow:
r = cmd
if a or _allow:
answer = rcon(cmd)
log(f"User: {from_id}({r}) in Chat: {peer_id} use RCON cmd: \"{cmd}\", with answer: \"{answer}\"")
if _write:
self.write(peer_id, f"RCON:\n{answer}")
else:
return answer
else:
log(f"User: {from_id}({r}) in Chat: {peer_id} no have rights RCON cmd: \"{cmd}\".")
def message_handle(message): def message_handle(self, message):
from_id = message['from_id'] from_id = message['from_id']
peer_id = message['peer_id'] peer_id = message['peer_id']
text = message['text'] text = message['text']
if text.startswith(".rcon "): if text.startswith(".rcon "):
rcon_cmd_handle(text[6:], from_id, peer_id) self.rcon_cmd_handle(text[6:], from_id, peer_id)
if text == "!help": if text == "!help":
write(peer_id, help_message) self.write(peer_id, help_message)
elif text == "!online": elif text == "!online":
text = rcon_cmd_handle('list', from_id, peer_id, True, True).replace("\n", "") text = self.rcon_cmd_handle('list', from_id, peer_id, False, True).replace("\n", "")
write(peer_id, text) self.write(peer_id, text)
# now = text[10:11] elif text == "!id":
# write(peer_id, f"Сейчас играет {now} человек" + ("" if now == "0" else f": {text[43:]}")) self.write(peer_id, f"Твой ID: {from_id}\nРоль в боте: {self.perms.get_role(from_id) or 'Отсутствует'}")
elif text == "!id":
write(peer_id, f"Твой ID: {from_id}\nРоль в боте: {perms.get_role(from_id) or 'Отсутствует'}")
def listen(self):
server, key, ts = self.get_lp_server()
log("Listening..")
while True:
lp = requests.get(f'{server}?act=a_check&key={key}&ts={ts}&wait=25').json()
try:
if lp.get('failed') is not None:
key = self.get_lp_server()[1]
if ts != lp.get('ts') and lp.get('updates'):
updates = lp['updates'][0]
if updates['type'] == "message_new":
self.message_handle(updates['object']['message'])
def listen(): ts = lp.get('ts')
server, key, ts = get_lp_server()
log("Listening..")
while True:
lp = requests.get(f'{server}?act=a_check&key={key}&ts={ts}&wait=25').json()
try:
if lp.get('failed') is not None:
key = get_lp_server()[1]
if ts != lp.get('ts') and lp.get('updates'):
updates = lp['updates'][0]
if updates['type'] == "message_new":
message_handle(updates['object']['message'])
ts = lp.get('ts') except KeyboardInterrupt:
print('\nExiting...')
exit(0)
except KeyboardInterrupt: except Exception as e:
print('\nExiting...') ts = lp.get('ts')
exit(0) print(f"Found exception: {e}")
print(traceback.format_exc())
except Exception as e:
ts = lp.get('ts')
print(f"Found exception: {e}")
print(traceback.format_exc())
if __name__ == '__main__': if __name__ == '__main__':
listen() _perms = Permissions(config['permission_file'])
bot = Bot(_perms)
bot.listen()