Compare commits

...

8 Commits

Author SHA1 Message Date
82869515f3 del none 2023-11-14 03:11:22 +03:00
856a71f048 add !id 2023-11-14 01:47:44 +03:00
507e744514 fix Permissions 2023-11-14 01:32:49 +03:00
40f2239e23 small changes 2023-11-14 01:31:23 +03:00
b1a40092e1 small changes 2023-11-14 01:21:47 +03:00
b790a97500 Perms system 2023-11-14 01:21:35 +03:00
4d560aa15a .IDEA 2023-11-14 00:47:55 +03:00
8ea15c7abf delete fake_admins 2023-11-14 00:47:49 +03:00
7 changed files with 115 additions and 44 deletions

7
.idea/Rcon-VK-Bot.iml generated
View File

@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4"> <module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager"> <component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" /> <content url="file://$MODULE_DIR$">
<orderEntry type="jdk" jdkName="Python 3.10" jdkType="Python SDK" /> <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/venv" />
</content>
<orderEntry type="jdk" jdkName="Python 3.10 (Rcon-VK-Bot)" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" /> <orderEntry type="sourceFolder" forTests="false" />
</component> </component>
</module> </module>

5
.idea/misc.xml generated
View File

@ -1,4 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<project version="4"> <project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" /> <component name="Black">
<option name="sdkName" value="Python 3.10 (Rcon-VK-Bot)" />
</component>
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10 (Rcon-VK-Bot)" project-jdk-type="Python SDK" />
</project> </project>

View File

@ -4,13 +4,32 @@
## Что умеет: ## Что умеет:
* Доступные тольно админам * Доступные разрешённым людям
* **.rcon <*commnd*>** - Исполняет <*commnd*> и отсылает ответ сервера * **.rcon <*commnd*>** - Исполняет <*commnd*> и отсылает ответ сервера
* **.wl <*nick*>** - По сути ссылка на whitelist add <*nick*>
* Доступные всем * Доступные всем
* **!help** - Выводит станичку с командами (строки 99-103 main.py) * **!help** - Выводит станичку с командами (строки 99-103 main.py)
* **!online** - Парсит rcon cmd *list* и выводит онлайн сервера * **!online** - Парсит rcon cmd *list* и выводит онлайн сервера
## Система permissions
В файле permissions.json указаны все пользователи с "повышенным" уровнем доступа к боту
Пример
```json
{
"<role>": {
"allow": ["<command_1>", "<command_2>"],
"members": [123]
},
"helper": {
"allow": ["say", "warn"],
"members": [111, 432]
}
}
```
Если `"allow": true` - разрешены все команды
## Как запустить? ## Как запустить?
1. Должен установлен быть Python3 (Если не установлен, не лезь, попроси друга айтишника помочь) 1. Должен установлен быть Python3 (Если не установлен, не лезь, попроси друга айтишника помочь)

View File

@ -6,7 +6,7 @@
}, },
"vk": { "vk": {
"token": "", "token": "",
"admins": [], "help_file": "help_message.txt"
"stoplist": [] },
} "permission_file": "permissions.json"
} }

4
src/help_message.txt Normal file
View File

@ -0,0 +1,4 @@
Тебе не нужна помощь, ты и так беспомощный, кожаный ублюдок. Так уж и быть, подскажу пару команд...
!help - Вывести эту "справку"
!online - Показать текущий онлайн сервере
Бот сделан кожанным петухом - админом, все вопросы к нему, я не причём.

View File

@ -16,18 +16,61 @@ log("Starting..")
with open('config-t.json' if "-t" in sys.argv else 'config.json') as f: with open('config-t.json' if "-t" in sys.argv else 'config.json') as f:
config = json.load(f) config = json.load(f)
with open('help_message.txt') as f:
help_message = f.read()
vk = vk.API(access_token=config['vk']['token'], v=5.131) vk = vk.API(access_token=config['vk']['token'], v=5.131)
group_id = vk.groups.getById()[0]['id'] group_id = vk.groups.getById()[0]['id']
log(f"Group id: {group_id}") log(f"Group id: {group_id}")
admins = config['vk']['admins']
fake_admins = []
stoplist = config['vk']['stoplist']
host = config['rcon']['host'] host = config['rcon']['host']
port = config['rcon']['port'] port = config['rcon']['port']
password = config['rcon']['password'] password = config['rcon']['password']
class Permissions:
def __init__(self, permission_file):
self.permission_file = permission_file
self._raw_file = {}
self._members = {}
self._parse_file()
def _parse_file(self):
with open(self.permission_file) as pf:
self._raw_file = json.load(pf)
for role, role_data in self._raw_file.items():
members = role_data.get("members", [])
allow = role_data.get("allow", [])
for member in members:
self._members[member] = {
"role": role,
"allow": allow
}
def is_allow(self, vk_id, cmd):
u = self._members.get(vk_id)
if u is not None:
role = u['role']
allow = u['allow']
if allow is True:
return True, role
elif cmd in allow:
return True, role
return False, role
return False, None
def get_role(self, vk_id):
u = self._members.get(vk_id)
if u is not None:
return u['role']
return None
perms = Permissions(config['permission_file'])
def fix_rcon_text(_srt): def fix_rcon_text(_srt):
try: try:
_srt = list(_srt) _srt = list(_srt)
@ -64,52 +107,41 @@ def write(peer_id, message):
if i > 30: if i > 30:
log("Found very long message...", 1) log("Found very long message...", 1)
break break
write(peer_id, message[:4095*i]) write(peer_id, message[:4095 * i])
else: else:
vk.messages.send(message=message, peer_id=peer_id, random_id=0) vk.messages.send(message=message, peer_id=peer_id, random_id=0)
def rcon_cmd_handle(cmd, from_id, peer_id, _write=True): def rcon_cmd_handle(cmd, from_id, peer_id, _write=True, _allow=False):
answer = rcon(cmd) a, r = perms.is_allow(from_id, cmd.split()[0])
log(f"User: {from_id} in Chat: {peer_id} use RCON cmd: \"{cmd}\", with answer: \"{answer}\"") if _allow:
if _write: r = cmd
write(peer_id, f"RCON:\n{answer}") 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:
return answer
else: else:
return answer log(f"User: {from_id}({r}) in Chat: {peer_id} no have rights RCON cmd: \"{cmd}\".")
def message_handle(message): def message_handle(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 from_id in admins: if text.startswith(".rcon "):
if text.startswith(".rcon "): rcon_cmd_handle(text[6:], from_id, peer_id)
rcon_cmd_handle(text[6:], from_id, peer_id)
elif text.startswith(".wl "):
rcon_cmd_handle(f'whitelist add {text[4:]}', from_id, peer_id)
elif text.startswith(".add "):
try:
i = int(text[5:])
fake_admins.append(i)
write(peer_id, f"Админ успешно добавлен: @id{i}")
except Exception as e:
write(peer_id, f"Ошибка добавления: {e}")
if from_id in fake_admins:
if text.startswith(".rcon "):
if text[5:].split()[0] in stoplist:
write(peer_id, "У вас нет доступа к этой команде")
else:
rcon_cmd_handle(text[6:], from_id, peer_id, False)
if text == "!help": if text == "!help":
write(peer_id, "Тебе не нужна помощь, ты и так беспомощный, кожаный ублюдок." write(peer_id, help_message)
"Так уж и быть, подскажу пару команд..\n\n"
"!help - Вывести эту \"справку\"\n"
"!online - Показать текущий онлайн сервере\n\n"
"Бот сделан кожанным петухом - админом, все вопросы к нему, я не причём.")
elif text == "!online": elif text == "!online":
text = rcon_cmd_handle('list', from_id, peer_id, False).replace("\n", "") text = rcon_cmd_handle('list', from_id, peer_id, True, True).replace("\n", "")
now = text[10:11] write(peer_id, text)
write(peer_id, f"Сейчас играет {now} человек" + ("" if now == "0" else f": {text[43:]}")) # 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 listen(): def listen():

10
src/permissions.json Normal file
View File

@ -0,0 +1,10 @@
{
"admin": {
"allow": true,
"members": [123]
},
"helper": {
"allow": ["say", "warn"],
"members": [111, 432]
}
}