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