ru aliases for commands names

This commit is contained in:
dan63047 2022-04-03 20:58:55 +03:00
parent fd2f5e687e
commit 37c0e3d4aa
3 changed files with 114 additions and 88 deletions

View File

@ -4,29 +4,29 @@
# Функции бота # Функции бота
Чтобы воспользоваться функциями бота необходимо отправить команду и в некоторых случаях агрумент. Все команды начинаются с восклицательного знака Чтобы воспользоваться функциями бота необходимо отправить команду и в некоторых случаях агрумент. Все команды начинаются с восклицательного знака
* **!h, !help** — бот отправляет список команд и их краткое описание, а так же дату последнего обновления и ссылку на этот репозиторий * **!h, !help, !п, !помощь** — бот отправляет список команд и их краткое описание из `help.txt`, а так же дату последнего обновления и ссылку на этот репозиторий
* **!my_id** — бот достаёт из вашего сообщения `user_id` и отправляет его вам * **!my_id, !ид** — бот достаёт из вашего сообщения `user_id` и отправляет его вам
* **!user_id *id*** — бот отправляет *id* нужного вам пользователя в vk api методом `users.get` и отправляет вам полученные этим методом данные: имя, фамилия, id, пол, время последнего онлайна и платформы, закрыт ли профиль * **!user_id, !пользователь *id*** — бот отправляет *id* нужного вам пользователя в vk api методом `users.get` и отправляет вам полученные этим методом данные: имя, фамилия, id, пол, время последнего онлайна и платформы, закрыт ли профиль
* **!group_id *id*** — бот отправляет *id* нужного вам сообщества в vk api методом `groups.getById` и отправляет вам полученные этим методом данные: название, описание, id, количество подписчиков * **!group_id, !группа *id*** — бот отправляет *id* нужного вам сообщества в vk api методом `groups.getById` и отправляет вам полученные этим методом данные: название, описание, id, количество подписчиков
* **!image** — бот, с помощью костыля в виде сервисного ключа приложения, получает vk api методом `photos.get` фотографии альбома, выбирает с помощью функции в python `random.randrange` одну фотографию и отправляет вам её как attachment * **!image, !картинка** — бот, с помощью костыля в виде сервисного ключа приложения, получает vk api методом `photos.get` фотографии альбома, выбирает с помощью функции в python `random.randrange` одну фотографию и отправляет вам её как attachment
* **!random *число1* *число2*** — бот генерирует с помощью `random.randint()` случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2* * **!random, !рандом *число1* *число2*** — бот генерирует с помощью `random.randint()` случайное число и отправляет его вам. Если без аргументов, то число от 0 до 10. Если есть одно число, то от 0 до *число1*. Если есть оба числа, то от *число1* до *число2*
* **!weather *город*** — бот получает с помощью OpenWeather API текущую погоду в городе и отправляет её вам * **!weather, !погода *город*** — бот получает с помощью OpenWeather API текущую погоду в городе и отправляет её вам
* **!wiki *запрос*** — бот получает с помощью Wikipedia API краткое описание статьи по запросу и отправляет её вам * **!wiki, !вики *запрос*** — бот получает с помощью Wikipedia API краткое описание статьи по запросу и отправляет её вам
* **!byn** — бот получает с помощью НБ РБ API текущий курс белорусского рубля и отправляет её вам * **!byn, !белруб** — бот получает с помощью НБ РБ API текущий курс белорусского рубля и отправляет её вам
* **!echo** — бот начинает повторять за вами, чтобы это остановить, надо написать *!echo off* * **!echo, !эхо** — бот начинает повторять за вами, чтобы это остановить, надо написать *!echo off*
* **!game *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл БД * **!game, !игра *камень/ножницы/бумага/статистика*** — бот играет с вами в "Камень, ножницы, бумага" и ведет статискику игр, которую записывает в файл БД
* **!midnight** — бот будет уведомлять о каждом миднайте по Московскому времени. Введите ещё раз, чтобы отменить это * **!midnight, !полночь** — бот будет уведомлять о каждом миднайте по Московскому времени. Введите ещё раз, чтобы отменить это
* **!subscribe** — бот будет уведомлять вас о каждом новом посте. Введите ещё раз, чтобы отменить это * **!subscribe, !подписаться** — бот будет уведомлять вас о каждом новом посте. Введите ещё раз, чтобы отменить это
* **!debug** — бот отправляет информацию о своём состоянии * **!debug, !дебаг** — бот отправляет информацию о своём состоянии
* **!debug *log*** — бот отправляет последние 10 строк из своего лога. Доступно только вам * **!debug *log***, **!дебаг *лог*** — бот отправляет последние 10 строк из своего лога. Доступно только вам
* **!debug *bots*** — бот отправляет информацию о обьектах бота в памяти. Доступно только вам * **!debug *bots***, **!дебаг *боты*** — бот отправляет информацию о обьектах бота в памяти. Доступно только вам
* **!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, реагировать на приход/уход участника беседы и дать возможность пользоваться командой *!ban*. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам * **!admin_mode, !админмод** — если чат, в которой активируется команда, является беседой и в ней у бота есть полномочия администратора, то бот переходит в режим модерации. Пока что он может только кикать людей за @all и @online, реагировать на приход/уход участника беседы и дать возможность пользоваться командой *!ban*. Введите ещё раз, чтобы выключить режим модерации. Доступно только вам
* **!ban *@user*** — банит пользователя из беседы (в смысле выгоняет, юзер не сможет вернутся пока бот или админ не предложит). Требует режим модерации * **!ban, !бан *@user*** — банит пользователя из беседы (в смысле выгоняет, юзер не сможет вернутся пока бот или админ не предложит). Требует режим модерации
* **!resist *@user*** — банит пользователя из бота * **!resist, !запретить *@user*** — запрещает пользователю пользоваться ботом
* **!restore *@user*** — снова разрешает пользователю пользоваться ботом * **!restore, !разрешить *@user*** — снова разрешает пользователю пользоваться ботом
# Установка и запуск бота # Установка и запуск бота
Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её. Лучшим решением будет иметь платный аккаунт на [pythonanywhere](https://www.pythonanywhere.com/) чтобы запускать бота, как Always-on task и использовать MySQL базу данных. Можно, конечно, не использовать БД и запускать бота в консоли, но pythonanywhere может выключить вашу консоль, если вы долго не будете посещать её.
@ -52,7 +52,7 @@
vk_group_token = "vk_group_token" # Токен сообщества vk_group_token = "vk_group_token" # Токен сообщества
group_id = 190322075 # Цифровой ид группы group_id = 190322075 # Цифровой ид группы
owner_id = 276193568 # Цифровой ид вашей страницы вк, чтобы вы могли управлять ботом в переписке owner_id = 276193568 # Цифровой ид вашей страницы вк, чтобы вы могли управлять ботом в переписке
admins = [276193568, 629085267] # Список ид аккаунтов администраторов, которые в любом случае тоже смогут получать доступ к командам администрирования admins = [276193568, 629085267] # Список ид аккаунтов администраторов, которые в любом случае тоже смогут получать доступ к командам администрирования, оставьте пустым, если их нет
vk_service_token = "vk_service_token" # Сервисный ключ доступа для команды !image. Оставьте None, если хотите выключить эту команду vk_service_token = "vk_service_token" # Сервисный ключ доступа для команды !image. Оставьте None, если хотите выключить эту команду
album_for_command = 269199619 # Цифровой ид альбома для команды !image. Оставьте None, если хотите выключить эту команду album_for_command = 269199619 # Цифровой ид альбома для команды !image. Оставьте None, если хотите выключить эту команду
openweathermap_api_key = 'openweathermap_api_key' # Ключ OpenWeather API. Оставьте None, если хотите выключить команду !weather openweathermap_api_key = 'openweathermap_api_key' # Ключ OpenWeather API. Оставьте None, если хотите выключить команду !weather

View File

@ -302,8 +302,10 @@ class VkBot:
self._ADMIN_MODE = admin_mode self._ADMIN_MODE = admin_mode
self._BANNED = banned self._BANNED = banned
self._OWNER = int(self._CHAT_ID) == int(config.owner_id) self._OWNER = int(self._CHAT_ID) == int(config.owner_id)
self._COMMANDS = ["!image", "!my_id", "!h", "!user_id", "!group_id", "!help", "!weather", "!wiki", "!byn", self._COMMANDS = ["!image", "!my_id", "!h", "!help", "!user_id", "!group_id", "!weather", "!wiki", "!byn", "!echo", "!game",
"!echo", "!game", "!debug", "!midnight", "!access", "!turnoff", "!ban", "!subscribe", "!random", "!admin_mode", "!resist", "!restore"] "!debug", "!midnight", "!access", "!turnoff", "!ban", "!subscribe", "!random", "!admin_mode", "!resist", "!restore",
"!картинка", "!ид", "!п", "!помощь", "!пользователь", "!группа", "!погода", "!вики", "!белруб", "!эхо", "!игра",
"!дебаг", "!полночь", "!доступ", "!выкл", "!бан", "!подписаться", "!рандом", "!админмод", "!запретить", "!разрешить"]
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)}, ban: {str(self._BANNED)}" 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: if (self._BANNED or db.get_from_users(int(event.message.from_id))["banned"]) and message[0] in self._COMMANDS:
respond['text'] = "Вам запрещено использовать бота" respond['text'] = "Вам запрещено использовать бота"
elif message[0] == "!image": elif message[0] == "!image" or message[0] == "!картинка":
if(random_image_command): if(random_image_command):
respond['attachment'] = self.random_image() respond['attachment'] = self.random_image()
else: else:
respond['text'] = errors_array["command_off"] respond['text'] = errors_array["command_off"]
elif message[0] == "!my_id": elif message[0] == "!my_id" or message[0] == "!ид":
respond['text'] = "Ваш ид: " + str(user_id) 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: with open('help.txt', 'r') as h:
help = h.read() help = h.read()
respond['text'] = help respond['text'] = help
h.close() h.close()
elif message[0] == "!user_id": elif message[0] == "!user_id" or message[0] == "!пользователь":
try: try:
respond['text'] = self.get_info_user(message[1]) respond['text'] = self.get_info_user(message[1])
except IndexError: except IndexError:
respond['text'] = errors_array["miss_argument"] respond['text'] = errors_array["miss_argument"]
elif message[0] == "!group_id": elif message[0] == "!group_id" or message[0] == "!группа":
try: try:
respond['text'] = self.get_info_group(message[1]) respond['text'] = self.get_info_group(message[1])
except IndexError: except IndexError:
respond['text'] = errors_array["miss_argument"] respond['text'] = errors_array["miss_argument"]
elif message[0] == "!weather": elif message[0] == "!weather" or message[0] == "!погода":
if(weather_command): if(weather_command):
try: try:
respond['text'] = get_weather(message[1]) respond['text'] = get_weather(message[1])
@ -424,28 +426,28 @@ class VkBot:
else: else:
respond['text'] = errors_array["command_off"] respond['text'] = errors_array["command_off"]
elif message[0] == "!wiki": elif message[0] == "!wiki" or message[0] == "!вики":
try: try:
respond['text'] = self.wiki_article(message[1]) respond['text'] = self.wiki_article(message[1])
except IndexError: except IndexError:
respond['text'] = errors_array["miss_argument"] respond['text'] = errors_array["miss_argument"]
elif message[0] == "!byn": elif message[0] == "!byn" or message[0] == "!белруб":
respond['text'] = self.exchange_rates() respond['text'] = self.exchange_rates()
elif message[0] == "!echo": elif message[0] == "!echo" or message[0] == "!эхо":
respond['text'] = "Теперь бот работает в режиме эхо. Чтобы это выключить, введить \"!echo off\"" respond['text'] = "Теперь бот работает в режиме эхо. Чтобы это выключить, введить \"!echo off\""
self.change_await("echo") self.change_await("echo")
log(False, f"[BOT_{self._CHAT_ID}] Enter in echo mode") log(False, f"[BOT_{self._CHAT_ID}] Enter in echo mode")
elif message[0] == "!game": elif message[0] == "!game" or message[0] == "!игра":
try: try:
message[1] = message[1].lower() message[1] = message[1].lower()
respond['text'] = self.game(message[1], user_id) respond['text'] = self.game(message[1], user_id)
except IndexError: except IndexError:
respond['text'] = errors_array["miss_argument"] 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): if self._ACCESS_TO_ALL or int(user_id) == int(config.owner_id):
try: try:
respond['text'] = self.debug(message[1]) respond['text'] = self.debug(message[1])
@ -454,7 +456,7 @@ class VkBot:
else: else:
respond["text"] = errors_array["access"] 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._ACCESS_TO_ALL or int(user_id) == int(config.owner_id):
if self._MIDNIGHT_EVENT: if self._MIDNIGHT_EVENT:
self.change_flag('midnight', False) self.change_flag('midnight', False)
@ -469,13 +471,13 @@ class VkBot:
else: else:
respond['text'] = errors_array["access"] respond['text'] = errors_array["access"]
elif message[0] == "!access": elif message[0] == "!access" or message[0] == "!доступ":
if int(user_id) == int(config.owner_id): if int(user_id) == int(config.owner_id):
try: try:
if message[1] == "owner": if message[1] == "owner" or message[1] == "владелец":
respond['text'] = "Теперь некоторыми командами может пользоваться только владелец бота" respond['text'] = "Теперь некоторыми командами может пользоваться только владелец бота"
self._ACCESS_TO_ALL = False self._ACCESS_TO_ALL = False
elif message[1] == "all": elif message[1] == "all" or message[1] == "все":
respond['text'] = "Теперь все могут пользоваться всеми командами" respond['text'] = "Теперь все могут пользоваться всеми командами"
self._ACCESS_TO_ALL = True self._ACCESS_TO_ALL = True
else: else:
@ -487,12 +489,12 @@ class VkBot:
else: else:
respond['text'] = errors_array["access"] 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): if self._OWNER or int(user_id) == int(config.owner_id):
self.send("Бот выключается") self.send("Бот выключается")
exit(log(False, "[SHUTDOWN]")) 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: 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: try:
victum = re.search(r'id\d+', message[1]) victum = re.search(r'id\d+', message[1])
@ -516,7 +518,7 @@ class VkBot:
else: else:
respond["text"] = errors_array["access"] 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._ACCESS_TO_ALL or int(user_id) == int(config.owner_id):
if self._NEW_POST: if self._NEW_POST:
self.change_flag('new_post', False) self.change_flag('new_post', False)
@ -532,7 +534,7 @@ class VkBot:
else: else:
respond['text'] = errors_array["access"] respond['text'] = errors_array["access"]
elif message[0] == "!random": elif message[0] == "!random" or message[0] == "!рандом":
try: try:
message[1] = message[1].split(' ', 1) message[1] = message[1].split(' ', 1)
try: try:
@ -544,7 +546,7 @@ class VkBot:
except: except:
respond['text'] = self.random_number(0, 10) 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: if int(self._CHAT_ID) <= 2000000000:
respond['text'] = "Данный чат не является беседой" respond['text'] = "Данный чат не является беседой"
elif int(user_id) != int(config.owner_id): elif int(user_id) != int(config.owner_id):
@ -566,7 +568,7 @@ class VkBot:
except Exception: except Exception:
respond["text"] = "У меня нет прав администратора" 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)): if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)):
try: try:
victum = re.search(r'id\d+', message[1]) victum = re.search(r'id\d+', message[1])
@ -574,6 +576,7 @@ class VkBot:
if int(victum) != int(config.owner_id): if int(victum) != int(config.owner_id):
if int(victum) not in bot: if int(victum) not in bot:
create_new_bot_object(int(victum)) create_new_bot_object(int(victum))
db.set_new_user(int(victum))
if not db.get_from_users(int(victum))["banned"]: if not db.get_from_users(int(victum))["banned"]:
bot[int(victum)].change_flag("banned", True) bot[int(victum)].change_flag("banned", True)
respond["text"] = "Теперь он не сможет воспользоваться ботом" respond["text"] = "Теперь он не сможет воспользоваться ботом"
@ -591,13 +594,14 @@ class VkBot:
else: else:
respond["text"] = errors_array["access"] 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)): if (self._OWNER or int(user_id) in config.admins or int(user_id) == int(config.owner_id)):
try: try:
victum = re.search(r'id\d+', message[1]) victum = re.search(r'id\d+', message[1])
victum = victum[0][2:] victum = victum[0][2:]
if int(victum) not in bot: if int(victum) not in bot:
create_new_bot_object(int(victum)) create_new_bot_object(int(victum))
db.set_new_user(int(victum))
if int(victum) != int(config.owner_id): if int(victum) != int(config.owner_id):
if db.get_from_users(int(victum))["banned"]: if db.get_from_users(int(victum))["banned"]:
bot[int(victum)].change_flag("banned", False) bot[int(victum)].change_flag("banned", False)
@ -620,26 +624,24 @@ class VkBot:
self.send(respond['text'], respond['attachment']) self.send(respond['text'], respond['attachment'])
def debug(self, arg=None): def debug(self, arg=None):
if arg == "log": if arg in ["log", "лог"]:
if self._OWNER: if not self._OWNER:
with open(log_path, 'r') as f:
log = list(deque(f, 10))
text_log = "<br>Последние 10 строк из лога:<br>"
for i in range(len(log)):
text_log += log[i]
f.close()
return text_log
else:
return errors_array["access"] return errors_array["access"]
elif arg == "bots": with open(log_path, 'r') as f:
if self._OWNER: log = list(deque(f, 10))
answer = "Обьекты бота:" text_log = "<br>Последние 10 строк из лога:<br>"
for i in bot: for item in log:
answer += "<br>"+str(bot[i]) text_log += item
return answer f.close()
else: return text_log
elif arg in ["bots", "боты"]:
if not self._OWNER:
return errors_array["access"] return errors_array["access"]
elif arg == "game": answer = "Обьекты бота:"
for i in bot:
answer += f"<br>{str(bot[i])}"
return answer
elif arg in ["game", "игра"]:
stats = db.get_game_stat() stats = db.get_game_stat()
if len(stats) > 0: if len(stats) > 0:
answer = "Статистика игроков в !game" answer = "Статистика игроков в !game"
@ -665,14 +667,38 @@ class VkBot:
time_d, time_h, time_min, time_sec) time_d, time_h, time_min, time_sec)
datetime_time = datetime.datetime.fromtimestamp( datetime_time = datetime.datetime.fromtimestamp(
debug_array['start_time']) debug_array['start_time'])
answer = "UPTIME: " + str_up_time + "<br>Прослушано сообщений: " + str( answer = (
debug_array['messages_get']) + "<br>Отправлено сообщений: " + str( (
debug_array['messages_answered']) + "<br>Ошибок в работе: " + str( (
debug_array['logger_warnings']) + ", из них:<br> •Беды с ВК: " + str( (
debug_array['vk_warnings']) + "<br> •Беды с БД: " + str( (
debug_array['db_warnings']) + "<br> •Беды с ботом: " + str( (
debug_array['bot_warnings']) + "<br>Обьектов бота: " + str( (
len(bot)) + "<br>Запуск бота по часам сервера: " + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC') (
f"UPTIME: {str_up_time}<br>Прослушано сообщений: "
+ str(debug_array['messages_get'])
)
+ "<br>Отправлено сообщений: "
)
+ str(debug_array['messages_answered'])
+ "<br>Ошибок в работе: "
)
+ str(debug_array['logger_warnings'])
+ ", из них:<br> •Беды с ВК: "
)
+ str(debug_array['vk_warnings'])
+ "<br> •Беды с БД: "
)
+ str(debug_array['db_warnings'])
+ "<br> •Беды с ботом: "
)
+ str(debug_array['bot_warnings'])
+ "<br>Обьектов бота: "
)
+ str(len(bot))
+ "<br>Запуск бота по часам сервера: "
) + datetime_time.strftime('%d.%m.%Y %H:%M:%S UTC')
return answer return answer
def game(self, thing, user_id): def game(self, thing, user_id):

View File

@ -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 Проект бота на GitHub: https://github.com/dan63047/dan63047pythonbot