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** — бот отправляет список команд и их краткое описание, а так же дату последнего обновления и ссылку на этот репозиторий
* **!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

View File

@ -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 = "<br>Последние 10 строк из лога:<br>"
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 += "<br>"+str(bot[i])
return answer
else:
with open(log_path, 'r') as f:
log = list(deque(f, 10))
text_log = "<br>Последние 10 строк из лога:<br>"
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"<br>{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 + "<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')
answer = (
(
(
(
(
(
(
(
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
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