mirror of
https://github.com/SantaSpeen/Rcon-VK-Bot.git
synced 2025-08-17 16:45:49 +00:00
Compare commits
2 Commits
ee70027d31
...
37c0dc6701
Author | SHA1 | Date | |
---|---|---|---|
37c0dc6701 | |||
fbace37008 |
@ -1,8 +1,8 @@
|
||||
{
|
||||
"rcon": {
|
||||
"host": "",
|
||||
"port": 0,
|
||||
"password": ""
|
||||
"host": "127.0.0.1",
|
||||
"port": 25575,
|
||||
"password": "P@ssw0rd"
|
||||
},
|
||||
"vk": {
|
||||
"token": "",
|
||||
|
159
src/main.py
159
src/main.py
@ -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:
|
||||
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']
|
||||
port = config['rcon']['port']
|
||||
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:
|
||||
|
||||
def __init__(self, permission_file):
|
||||
@ -69,93 +76,83 @@ class Permissions:
|
||||
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):
|
||||
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}"
|
||||
def get_lp_server(self):
|
||||
lp = vk.groups.getLongPollServer(group_id=self.group_id)
|
||||
return lp.get('server'), lp.get('key'), lp.get('ts')
|
||||
|
||||
|
||||
def get_lp_server():
|
||||
lp = vk.groups.getLongPollServer(group_id=group_id)
|
||||
return lp.get('server'), lp.get('key'), lp.get('ts')
|
||||
|
||||
|
||||
def write(peer_id, message):
|
||||
if len(message) > 4095:
|
||||
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}")
|
||||
def write(self, peer_id, message):
|
||||
if len(message) > 4095:
|
||||
messages = (len(message) // 4095)
|
||||
for i in range(1, messages + 1):
|
||||
if i > 30:
|
||||
log("Found very long message...", 1)
|
||||
break
|
||||
self.write(peer_id, message[:4095 * i])
|
||||
else:
|
||||
return answer
|
||||
else:
|
||||
log(f"User: {from_id}({r}) in Chat: {peer_id} no have rights RCON cmd: \"{cmd}\".")
|
||||
vk.messages.send(message=message, peer_id=peer_id, random_id=0)
|
||||
|
||||
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):
|
||||
from_id = message['from_id']
|
||||
peer_id = message['peer_id']
|
||||
text = message['text']
|
||||
if text.startswith(".rcon "):
|
||||
rcon_cmd_handle(text[6:], from_id, peer_id)
|
||||
if text == "!help":
|
||||
write(peer_id, help_message)
|
||||
elif text == "!online":
|
||||
text = rcon_cmd_handle('list', from_id, peer_id, True, True).replace("\n", "")
|
||||
write(peer_id, text)
|
||||
# now = text[10:11]
|
||||
# write(peer_id, f"Сейчас играет {now} человек" + ("" if now == "0" else f": {text[43:]}"))
|
||||
elif text == "!id":
|
||||
write(peer_id, f"Твой ID: {from_id}\nРоль в боте: {perms.get_role(from_id) or 'Отсутствует'}")
|
||||
def message_handle(self, message):
|
||||
from_id = message['from_id']
|
||||
peer_id = message['peer_id']
|
||||
text = message['text']
|
||||
if text.startswith(".rcon "):
|
||||
self.rcon_cmd_handle(text[6:], from_id, peer_id)
|
||||
if text == "!help":
|
||||
self.write(peer_id, help_message)
|
||||
elif text == "!online":
|
||||
text = self.rcon_cmd_handle('list', from_id, peer_id, False, True).replace("\n", "")
|
||||
self.write(peer_id, text)
|
||||
elif text == "!id":
|
||||
self.write(peer_id, f"Твой ID: {from_id}\nРоль в боте: {self.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():
|
||||
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')
|
||||
|
||||
ts = lp.get('ts')
|
||||
except KeyboardInterrupt:
|
||||
print('\nExiting...')
|
||||
exit(0)
|
||||
|
||||
except KeyboardInterrupt:
|
||||
print('\nExiting...')
|
||||
exit(0)
|
||||
|
||||
except Exception as e:
|
||||
ts = lp.get('ts')
|
||||
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__':
|
||||
listen()
|
||||
_perms = Permissions(config['permission_file'])
|
||||
bot = Bot(_perms)
|
||||
bot.listen()
|
||||
|
Loading…
x
Reference in New Issue
Block a user