!ban (someone asked)

This commit is contained in:
dan63047 2022-04-02 18:47:39 +03:00
parent fd025a1bb9
commit 65cff4180b
2 changed files with 56 additions and 5 deletions

View File

@ -23,7 +23,9 @@
* **!debug *game*** — бот отправляет всю статистику по игре !game * **!debug *game*** — бот отправляет всю статистику по игре !game
* **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам * **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам
* **!turnoff** — даёт боту команду на выключение. Доступно только вам * **!turnoff** — даёт боту команду на выключение. Доступно только вам
* **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам * **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы и дать возможность пользоваться командой *!ban*. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам
* **!ban *@user*** — банит пользователя из беседы (в смысле выгоняет, юзер не сможет вернутся пока бот или админ не предложит). Требует режим модерации
# Установка и запуск бота # Установка и запуск бота
Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её. Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её.
## Основа ## Основа

View File

@ -7,6 +7,7 @@ import logging
import pyowm import pyowm
import random import random
import json import json
import re
import threading import threading
import pymysql import pymysql
import wikipediaapi as wiki import wikipediaapi as wiki
@ -312,7 +313,7 @@ class VkBot:
self._OWNER = False self._OWNER = False
self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn", self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn",
"!echo", "!game", "!debug", "!midnight", "!access", "!turnoff", "!reminder", "!subscribe", "!random", "!admin_mode"] "!echo", "!game", "!debug", "!midnight", "!access", "!turnoff", "!ban", "!subscribe", "!random", "!admin_mode"]
def __str__(self): def __str__(self):
return f"[BOT_{str(self._CHAT_ID)}] a: {str(self._ACCESS_TO_ALL)}, mn: {str(self._MIDNIGHT_EVENT)}, await: {str(self._AWAITING_INPUT_MODE)}, sub: {str(self._NEW_POST)}, adm: {str(self._ADMIN_MODE)}" return f"[BOT_{str(self._CHAT_ID)}] a: {str(self._ACCESS_TO_ALL)}, mn: {str(self._MIDNIGHT_EVENT)}, await: {str(self._AWAITING_INPUT_MODE)}, sub: {str(self._NEW_POST)}, adm: {str(self._ADMIN_MODE)}"
@ -479,10 +480,10 @@ class VkBot:
try: try:
if message[1] == "owner": if message[1] == "owner":
respond['text'] = "Теперь некоторыми командами может пользоваться только владелец бота" respond['text'] = "Теперь некоторыми командами может пользоваться только владелец бота"
self.change_flag('admin_mode', False) self._ACCESS_TO_ALL = False
elif message[1] == "all": elif message[1] == "all":
respond['text'] = "Теперь все могут пользоваться всеми командами" respond['text'] = "Теперь все могут пользоваться всеми командами"
self.change_flag('admin_mode', True) self._ACCESS_TO_ALL = True
else: else:
respond['text'] = "Некорректный аргумент" respond['text'] = "Некорректный аргумент"
except IndexError: except IndexError:
@ -498,7 +499,29 @@ class VkBot:
exit(log(False, "[SHUTDOWN]")) exit(log(False, "[SHUTDOWN]"))
elif message[0] == self._COMMANDS[15]: elif message[0] == self._COMMANDS[15]:
respond['text'] = "Функция удалена за ненадобнастью" if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)) and self._ADMIN_MODE and int(self._CHAT_ID) > 2000000000:
try:
victum = re.search(r'id\d+', message[1])
if int(victum[0][-2:]) != int(config.owner_id):
vk.method("messages.removeChatUser", {"chat_id": int(
self._CHAT_ID)-2000000000, "member_id": victum[0][-2:]})
log(False,
f"[BOT_{self._CHAT_ID}] user {victum[0]} has been kicked")
else:
log(False, f"[BOT_{self._CHAT_ID}] can't kick owner")
except IndexError:
respond['text'] = errors_array["miss_argument"]
except Exception as e:
respond['text'] = f"Ошибка: {str(e)}"
log(True,
f"[BOT_{self._CHAT_ID}] can't kick user {victum[0]} - {str(e)}")
else:
if int(self._CHAT_ID) <= 2000000000:
respond['text'] = "Данный чат не является беседой"
if not self._ADMIN_MODE:
respond["text"] = "Бот не в режиме модерирования"
else:
respond["text"] = errors_array["access"]
elif message[0] == self._COMMANDS[16]: elif message[0] == self._COMMANDS[16]:
if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id): if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id):
@ -527,6 +550,7 @@ class VkBot:
0, int(message[1][0])) 0, int(message[1][0]))
except: except:
respond['text'] = self.random_number(0, 10) respond['text'] = self.random_number(0, 10)
elif message[0] == self._COMMANDS[18]: elif message[0] == self._COMMANDS[18]:
if int(self._CHAT_ID) <= 2000000000: if int(self._CHAT_ID) <= 2000000000:
respond['text'] = "Данный чат не является беседой" respond['text'] = "Данный чат не является беседой"
@ -548,6 +572,31 @@ class VkBot:
f"[BOT_{self._CHAT_ID}] Admin mode: {self._ADMIN_MODE}") f"[BOT_{self._CHAT_ID}] Admin mode: {self._ADMIN_MODE}")
except Exception: except Exception:
respond["text"] = "У меня нет прав администратора" respond["text"] = "У меня нет прав администратора"
elif message[0] == self._COMMANDS[19]: #бот не может восстанавливать пользователя из беседы, соре
if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)) and self._ADMIN_MODE:
try:
victum = re.search(r'id\d+', message[1])
if int(victum[0][-2:]) != int(config.owner_id):
vk.method("messages.addChatUser", {"chat_id": int(
self._CHAT_ID)-2000000000, "user_id": victum[0][-2:]})
log(False,
f"[BOT_{self._CHAT_ID}] user {victum[0]} has been kicked")
else:
log(False, f"[BOT_{self._CHAT_ID}] can't kick owner")
except IndexError:
respond['text'] = errors_array["miss_argument"]
except Exception as e:
respond['text'] = f"Ошибка: {str(e)}"
log(True,
f"[BOT_{self._CHAT_ID}] can't kick user {victum[0]} - {str(e)}")
else:
if int(self._CHAT_ID) <= 2000000000:
respond['text'] = "Данный чат не является беседой"
if not self._ADMIN_MODE:
respond["text"] = "Бот не в режиме модерирования"
else:
respond["text"] = errors_array["access"]
if respond['text'] or respond['attachment']: if respond['text'] or respond['attachment']:
self.send(respond['text'], respond['attachment']) self.send(respond['text'], respond['attachment'])