diff --git a/README.md b/README.md index ac02756..8fe9f01 100644 --- a/README.md +++ b/README.md @@ -4,29 +4,29 @@ # Функции бота Чтобы воспользоваться функциями бота необходимо отправить команду и в некоторых случаях агрумент. Все команды начинаются с восклицательного знака -* **!h, !help** — бот отправляет список команд и их краткое описание, а так же дату последнего обновления и ссылку на этот репозиторий -* **!my_id** — бот достаёт из вашего сообщения `user_id` и отправляет его вам -* **!user_id *id*** — бот отправляет *id* нужного вам пользователя в vk api методом `users.get` и отправляет вам полученные этим методом данные: имя, фамилия, id, пол, время последнего онлайна и платформы, закрыт ли профиль -* **!group_id *id*** — бот отправляет *id* нужного вам сообщества в vk api методом `groups.getById` и отправляет вам полученные этим методом данные: название, описание, id, количество подписчиков -* **!image** — бот, с помощью костыля в виде сервисного ключа приложения, получает vk api методом `photos.get` фотографии альбома, выбирает с помощью функции в python `random.randrange` одну фотографию и отправляет вам её как attachment -* **!random *число1* *число2*** — бот генерирует с помощью `random.randint()` случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2* -* **!weather *город*** — бот получает с помощью OpenWeather API текущую погоду в городе и отправляет её вам -* **!wiki *запрос*** — бот получает с помощью Wikipedia API краткое описание статьи по запросу и отправляет её вам -* **!byn** — бот получает с помощью НБ РБ API текущий курс белорусского рубля и отправляет её вам -* **!echo** — бот начинает повторять за вами, чтобы это остановить, надо написать *!echo off* -* **!game *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл БД -* **!midnight** — бот будет уведомлять о каждом миднайте по Московскому времени. Введите ещё раз, чтобы отменить это -* **!subscribe** — бот будет уведомлять вас о каждом новом посте. Введите ещё раз, чтобы отменить это -* **!debug** — бот отправляет информацию о своём состоянии -* **!debug *log*** — бот отправляет последние 10 строк из своего лога. Доступно только вам -* **!debug *bots*** — бот отправляет информацию о обьектах бота в памяти. Доступно только вам -* **!debug *game*** — бот отправляет всю статистику по игре !game -* **!access *all/owner*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам -* **!turnoff** — даёт боту команду на выключение. Доступно только вам -* **!admin_mode** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы и дать возможность пользоваться командой *!ban*. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам -* **!ban *@user*** — банит пользователя из беседы (в смысле выгоняет, юзер не сможет вернутся пока бот или админ не предложит). Требует режим модерации -* **!resist *@user*** — банит пользователя из бота -* **!restore *@user*** — снова разрешает пользователю пользоваться ботом +* **!h, !help, !п, !помощь** — бот отправляет список команд и их краткое описание из `help.txt`, а так же дату последнего обновления и ссылку на этот репозиторий +* **!my_id, !ид** — бот достаёт из вашего сообщения `user_id` и отправляет его вам +* **!user_id, !пользователь *id*** — бот отправляет *id* нужного вам пользователя в vk api методом `users.get` и отправляет вам полученные этим методом данные: имя, фамилия, id, пол, время последнего онлайна и платформы, закрыт ли профиль +* **!group_id, !группа *id*** — бот отправляет *id* нужного вам сообщества в vk api методом `groups.getById` и отправляет вам полученные этим методом данные: название, описание, id, количество подписчиков +* **!image, !картинка** — бот, с помощью костыля в виде сервисного ключа приложения, получает vk api методом `photos.get` фотографии альбома, выбирает с помощью функции в python `random.randrange` одну фотографию и отправляет вам её как attachment +* **!random, !рандом *число1* *число2*** — бот генерирует с помощью `random.randint()` случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2* +* **!weather, !погода *город*** — бот получает с помощью OpenWeather API текущую погоду в городе и отправляет её вам +* **!wiki, !вики *запрос*** — бот получает с помощью Wikipedia API краткое описание статьи по запросу и отправляет её вам +* **!byn, !белруб** — бот получает с помощью НБ РБ API текущий курс белорусского рубля и отправляет её вам +* **!echo, !эхо** — бот начинает повторять за вами, чтобы это остановить, надо написать *!echo off* +* **!game, !игра *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл БД +* **!midnight, !полночь** — бот будет уведомлять о каждом миднайте по Московскому времени. Введите ещё раз, чтобы отменить это +* **!subscribe, !подписаться** — бот будет уведомлять вас о каждом новом посте. Введите ещё раз, чтобы отменить это +* **!debug, !дебаг** — бот отправляет информацию о своём состоянии +* **!debug *log***, **!дебаг *лог*** — бот отправляет последние 10 строк из своего лога. Доступно только вам +* **!debug *bots***, **!дебаг *боты*** — бот отправляет информацию о обьектах бота в памяти. Доступно только вам +* **!debug *game***, **!дебаг *игра*** — бот отправляет всю статистику по игре !game +* **!access *all/owner***, **!доступ *владелец/все*** — позволяет в беседе установить уровень доступа к командам *!midnight*, *!subscribe* и *!debug*. *all* - все могут пользоваться. *owner* - только вы. Доступно только вам +* **!turnoff, !выкл** — даёт боту команду на выключение. Доступно только вам +* **!admin_mode, !админмод** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы и дать возможность пользоваться командой *!ban*. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам +* **!ban, !бан *@user*** — банит пользователя из беседы (в смысле выгоняет, юзер не сможет вернутся пока бот или админ не предложит). Требует режим модерации +* **!resist, !запретить *@user*** — запрещает пользователю пользоваться ботом +* **!restore, !разрешить *@user*** — снова разрешает пользователю пользоваться ботом # Установка и запуск бота Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её. @@ -52,7 +52,7 @@ vk_group_token = "vk_group_token" # Токен сообщества group_id = 190322075 # Цифровой ид группы owner_id = 276193568 # Цифровой ид вашей страницы вк, чтобы вы могли управлять ботом в переписке -admins = [276193568, 629085267] # Список ид аккаунтов администраторов, которые в любом случае тоже смогут получать доступ к командам администрирования +admins = [276193568, 629085267] # Список ид аккаунтов администраторов, которые в любом случае тоже смогут получать доступ к командам администрирования, оставьте пустым, если их нет vk_service_token = "vk_service_token" # Сервисный ключ доступа для команды !image. Оставьте None, если хотите выключить эту команду album_for_command = 269199619 # Цифровой ид альбома для команды !image. Оставьте None, если хотите выключить эту команду openweathermap_api_key = 'openweathermap_api_key' # Ключ OpenWeather API. Оставьте None, если хотите выключить команду !weather diff --git a/dan63047VKbot.py b/dan63047VKbot.py index 878421f..27cc7d7 100644 --- a/dan63047VKbot.py +++ b/dan63047VKbot.py @@ -302,8 +302,10 @@ class VkBot: self._ADMIN_MODE = admin_mode self._BANNED = banned self._OWNER = int(self._CHAT_ID) == int(config.owner_id) - self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn", - "!echo", "!game", "!debug", "!midnight", "!access", "!turnoff", "!ban", "!subscribe", "!random", "!admin_mode", "!resist", "!restore"] + self._COMMANDS = ["!image", "!my_id", "!h", "!help", "!user_id", "!group_id", "!weather", "!wiki", "!byn", "!echo", "!game", + "!debug", "!midnight", "!access", "!turnoff", "!ban", "!subscribe", "!random", "!admin_mode", "!resist", "!restore", + "!картинка", "!ид", "!п", "!помощь", "!пользователь", "!группа", "!погода", "!вики", "!белруб", "!эхо", "!игра", + "!дебаг", "!полночь", "!доступ", "!выкл", "!бан", "!подписаться", "!рандом", "!админмод", "!запретить", "!разрешить"] 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)}, ban: {str(self._BANNED)}" @@ -388,34 +390,34 @@ class VkBot: if (self._BANNED or db.get_from_users(int(event.message.from_id))["banned"]) and message[0] in self._COMMANDS: respond['text'] = "Вам запрещено использовать бота" - elif message[0] == "!image": + elif message[0] == "!image" or message[0] == "!картинка": if(random_image_command): respond['attachment'] = self.random_image() else: respond['text'] = errors_array["command_off"] - elif message[0] == "!my_id": + elif message[0] == "!my_id" or message[0] == "!ид": respond['text'] = "Ваш ид: " + str(user_id) - elif message[0] == "!h" or message[0] == "!help": + elif message[0] in ["!h", "!help", "!п", "!помощь"]: with open('help.txt', 'r') as h: help = h.read() respond['text'] = help h.close() - elif message[0] == "!user_id": + elif message[0] == "!user_id" or message[0] == "!пользователь": try: respond['text'] = self.get_info_user(message[1]) except IndexError: respond['text'] = errors_array["miss_argument"] - elif message[0] == "!group_id": + elif message[0] == "!group_id" or message[0] == "!группа": try: respond['text'] = self.get_info_group(message[1]) except IndexError: respond['text'] = errors_array["miss_argument"] - elif message[0] == "!weather": + elif message[0] == "!weather" or message[0] == "!погода": if(weather_command): try: respond['text'] = get_weather(message[1]) @@ -424,28 +426,28 @@ class VkBot: else: respond['text'] = errors_array["command_off"] - elif message[0] == "!wiki": + elif message[0] == "!wiki" or message[0] == "!вики": try: respond['text'] = self.wiki_article(message[1]) except IndexError: respond['text'] = errors_array["miss_argument"] - elif message[0] == "!byn": + elif message[0] == "!byn" or message[0] == "!белруб": respond['text'] = self.exchange_rates() - elif message[0] == "!echo": + elif message[0] == "!echo" or message[0] == "!эхо": respond['text'] = "Теперь бот работает в режиме эхо. Чтобы это выключить, введить \"!echo off\"" self.change_await("echo") log(False, f"[BOT_{self._CHAT_ID}] Enter in echo mode") - elif message[0] == "!game": + elif message[0] == "!game" or message[0] == "!игра": try: message[1] = message[1].lower() respond['text'] = self.game(message[1], user_id) except IndexError: respond['text'] = errors_array["miss_argument"] - elif message[0] == "!debug": + elif message[0] == "!debug" or message[0] == "!дебаг": if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id): try: respond['text'] = self.debug(message[1]) @@ -454,7 +456,7 @@ class VkBot: else: respond["text"] = errors_array["access"] - elif message[0] == "!midnight": + elif message[0] == "!midnight" or message[0] == "!полночь": if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id): if self._MIDNIGHT_EVENT: self.change_flag('midnight', False) @@ -469,13 +471,13 @@ class VkBot: else: respond['text'] = errors_array["access"] - elif message[0] == "!access": + elif message[0] == "!access" or message[0] == "!доступ": if int(user_id) == int(config.owner_id): try: - if message[1] == "owner": + if message[1] == "owner" or message[1] == "владелец": respond['text'] = "Теперь некоторыми командами может пользоваться только владелец бота" self._ACCESS_TO_ALL = False - elif message[1] == "all": + elif message[1] == "all" or message[1] == "все": respond['text'] = "Теперь все могут пользоваться всеми командами" self._ACCESS_TO_ALL = True else: @@ -487,12 +489,12 @@ class VkBot: else: respond['text'] = errors_array["access"] - elif message[0] == "!turnoff": + elif message[0] == "!turnoff" or message[0] == "!выкл": if self._OWNER or int(user_id) == int(config.owner_id): self.send("Бот выключается") exit(log(False, "[SHUTDOWN]")) - elif message[0] == "!ban": + elif message[0] == "!ban" or message[0] == "!бан": 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]) @@ -516,7 +518,7 @@ class VkBot: else: respond["text"] = errors_array["access"] - elif message[0] == "!subscribe": + elif message[0] == "!subscribe" or message[0] == "!подписаться": if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id): if self._NEW_POST: self.change_flag('new_post', False) @@ -532,7 +534,7 @@ class VkBot: else: respond['text'] = errors_array["access"] - elif message[0] == "!random": + elif message[0] == "!random" or message[0] == "!рандом": try: message[1] = message[1].split(' ', 1) try: @@ -544,7 +546,7 @@ class VkBot: except: respond['text'] = self.random_number(0, 10) - elif message[0] == "!admin_mode": + elif message[0] == "!admin_mode" or message[0] == "!админмод": if int(self._CHAT_ID) <= 2000000000: respond['text'] = "Данный чат не является беседой" elif int(user_id) != int(config.owner_id): @@ -566,7 +568,7 @@ class VkBot: except Exception: respond["text"] = "У меня нет прав администратора" - elif message[0] == "!resist": + elif message[0] == "!resist" or message[0] == "!запретить": if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)): try: victum = re.search(r'id\d+', message[1]) @@ -574,6 +576,7 @@ class VkBot: if int(victum) != int(config.owner_id): if int(victum) not in bot: create_new_bot_object(int(victum)) + db.set_new_user(int(victum)) if not db.get_from_users(int(victum))["banned"]: bot[int(victum)].change_flag("banned", True) respond["text"] = "Теперь он не сможет воспользоваться ботом" @@ -591,13 +594,14 @@ class VkBot: else: respond["text"] = errors_array["access"] - elif message[0] == "!restore": + elif message[0] == "!restore" or message[0] == "!разрешить": if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)): try: victum = re.search(r'id\d+', message[1]) victum = victum[0][2:] if int(victum) not in bot: create_new_bot_object(int(victum)) + db.set_new_user(int(victum)) if int(victum) != int(config.owner_id): if db.get_from_users(int(victum))["banned"]: bot[int(victum)].change_flag("banned", False) @@ -620,26 +624,24 @@ class VkBot: self.send(respond['text'], respond['attachment']) def debug(self, arg=None): - if arg == "log": - if self._OWNER: - with open(log_path, 'r') as f: - log = list(deque(f, 10)) - text_log = "
Последние 10 строк из лога:
" - for i in range(len(log)): - text_log += log[i] - f.close() - return text_log - else: + if arg in ["log", "лог"]: + if not self._OWNER: return errors_array["access"] - elif arg == "bots": - if self._OWNER: - answer = "Обьекты бота:" - for i in bot: - answer += "
"+str(bot[i]) - return answer - else: + with open(log_path, 'r') as f: + log = list(deque(f, 10)) + text_log = "
Последние 10 строк из лога:
" + for item in log: + text_log += item + f.close() + return text_log + elif arg in ["bots", "боты"]: + if not self._OWNER: return errors_array["access"] - elif arg == "game": + answer = "Обьекты бота:" + for i in bot: + answer += f"
{str(bot[i])}" + return answer + elif arg in ["game", "игра"]: stats = db.get_game_stat() if len(stats) > 0: answer = "Статистика игроков в !game" @@ -665,14 +667,38 @@ class VkBot: time_d, time_h, time_min, time_sec) datetime_time = datetime.datetime.fromtimestamp( debug_array['start_time']) - answer = "UPTIME: " + str_up_time + "
Прослушано сообщений: " + str( - debug_array['messages_get']) + "
Отправлено сообщений: " + str( - debug_array['messages_answered']) + "
Ошибок в работе: " + str( - debug_array['logger_warnings']) + ", из них:
•Беды с ВК: " + str( - debug_array['vk_warnings']) + "
•Беды с БД: " + str( - debug_array['db_warnings']) + "
•Беды с ботом: " + str( - debug_array['bot_warnings']) + "
Обьектов бота: " + str( - len(bot)) + "
Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC') + answer = ( + ( + ( + ( + ( + ( + ( + ( + f"UPTIME: {str_up_time}
Прослушано сообщений: " + + str(debug_array['messages_get']) + ) + + "
Отправлено сообщений: " + ) + + str(debug_array['messages_answered']) + + "
Ошибок в работе: " + ) + + str(debug_array['logger_warnings']) + + ", из них:
•Беды с ВК: " + ) + + str(debug_array['vk_warnings']) + + "
•Беды с БД: " + ) + + str(debug_array['db_warnings']) + + "
•Беды с ботом: " + ) + + str(debug_array['bot_warnings']) + + "
Обьектов бота: " + ) + + str(len(bot)) + + "
Запуск бота по часам сервера: " + ) + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC') + return answer def game(self, thing, user_id): diff --git a/help.txt b/help.txt index e7eae03..a7c645c 100644 --- a/help.txt +++ b/help.txt @@ -1,31 +1,31 @@ Я бот, призванный доставлять неудобства. Команды: -!my_id - сообщит ваш id в ВК +!my_id, !ид - сообщит ваш id в ВК -!user_id *id* - сообщит информацию о этом пользователе +!user_id, !пользователь *id* - сообщит информацию о этом пользователе -!group_id *id* - сообщит информацию о этой группе +!group_id, !группа *id* - сообщит информацию о этой группе -!image - отправляет рандомную картинку из альбома +!image, !картинка - отправляет рандомную картинку из альбома -!weather *город* - отправляет текущую погоду в городе (данные из OpenWeather API) +!weather, !погода *город* - отправляет текущую погоду в городе (данные из OpenWeather API) -!wiki *запрос* - отправляет информацию об этом из Wikipedia +!wiki, !вики *запрос* - отправляет информацию об этом из Wikipedia -!byn - отправляет текущий курс валют, полученный из API НБ РБ +!byn, !белруб - отправляет текущий курс валют, полученный из API НБ РБ -!echo - бот отправляет вам всё, что вы ему пишите +!echo, !эхо - бот отправляет вам всё, что вы ему пишите -!game *камень/ножницы/бумага/статистика* - бот будет играть с вами в "Камень, ножницы, бумага" и записывать статистику +!game, !игра *камень/ножницы/бумага/статистика* - бот будет играть с вами в "Камень, ножницы, бумага" и записывать статистику -!random *число1* *число2* - генерирует случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2* +!random, !рандом *число1* *число2* - генерирует случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2* -!midnight - бот будет уведомлять вас о 00:00 по Москве. Отправьте ещё раз, чтобы бот больше вас не уведомлял +!midnight, !полночь - бот будет уведомлять вас о 00:00 по Москве. Отправьте ещё раз, чтобы бот больше вас не уведомлял -!subscribe - бот будет уведомлять вас новых постах в группе. Отправьте ещё раз, чтобы бот больше вас не уведомлял +!subscribe, !подписаться - бот будет уведомлять вас новых постах в группе. Отправьте ещё раз, чтобы бот больше вас не уведомлял -!h, !help - справка +!h, !help, !п, !помощь - справка -Дата последнего обновления: 25.07.2020 (Бот в админ режиме реагирует на приход/уход участников беседы) +Дата последнего обновления: 03.04.2022 (Функции по запрету пользования ботом) Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot