mirror of
https://github.com/SantaSpeen/Rcon-VK-Bot.git
synced 2025-08-18 09:05:53 +00:00
Compare commits
2 Commits
ee70027d31
...
37c0dc6701
Author | SHA1 | Date | |
---|---|---|---|
37c0dc6701 | |||
fbace37008 |
@ -1,8 +1,8 @@
|
|||||||
{
|
{
|
||||||
"rcon": {
|
"rcon": {
|
||||||
"host": "",
|
"host": "127.0.0.1",
|
||||||
"port": 0,
|
"port": 25575,
|
||||||
"password": ""
|
"password": "P@ssw0rd"
|
||||||
},
|
},
|
||||||
"vk": {
|
"vk": {
|
||||||
"token": "",
|
"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:
|
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()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user