add ping bot
This commit is contained in:
parent
0bdde95b06
commit
54d74e526f
@ -2,5 +2,7 @@ from .overlay import OverlayBotModuleConfig
|
|||||||
from .channel_helper import ChannelHelperBotModuleConfig, QueuedItem
|
from .channel_helper import ChannelHelperBotModuleConfig, QueuedItem
|
||||||
from .echo import EchoBotModuleConfig
|
from .echo import EchoBotModuleConfig
|
||||||
from .cyberlina import CyberLinaBotModuleConfig
|
from .cyberlina import CyberLinaBotModuleConfig
|
||||||
|
from .ping import PingBotModuleConfig
|
||||||
|
|
||||||
BOT_MODULES = [EchoBotModuleConfig, ChannelHelperBotModuleConfig, OverlayBotModuleConfig, CyberLinaBotModuleConfig]
|
BOT_MODULES = [EchoBotModuleConfig, ChannelHelperBotModuleConfig, OverlayBotModuleConfig, CyberLinaBotModuleConfig,
|
||||||
|
PingBotModuleConfig]
|
||||||
|
87
bots/modules/ping.py
Normal file
87
bots/modules/ping.py
Normal file
@ -0,0 +1,87 @@
|
|||||||
|
import os
|
||||||
|
from tempfile import TemporaryDirectory
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
from PIL import Image
|
||||||
|
from django.db import models
|
||||||
|
from django import forms
|
||||||
|
from django.forms import modelformset_factory
|
||||||
|
from jsonfield import JSONField
|
||||||
|
from telegram import Update
|
||||||
|
from telegram.ext import Dispatcher, CallbackContext, MessageHandler, Filters, CommandHandler
|
||||||
|
from telegram.utils.helpers import mention_html
|
||||||
|
|
||||||
|
from bots.models import TelegramBotModuleConfig
|
||||||
|
|
||||||
|
|
||||||
|
class PingBotCategory(models.Model):
|
||||||
|
chat_id = models.BigIntegerField(db_index=True)
|
||||||
|
cat_name = models.CharField(max_length=64, db_index=True)
|
||||||
|
user_ids = JSONField(default='[]')
|
||||||
|
|
||||||
|
def add_user(self, uid: int):
|
||||||
|
user_ids = set(self.user_ids)
|
||||||
|
user_ids.add(uid)
|
||||||
|
self.user_ids = list(user_ids)
|
||||||
|
|
||||||
|
def remove_user(self, uid: int):
|
||||||
|
user_ids = set(self.user_ids)
|
||||||
|
user_ids.add(uid)
|
||||||
|
self.user_ids = list(user_ids)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
unique_together = 'chat_id', 'cat_name',
|
||||||
|
|
||||||
|
|
||||||
|
class PingBotModuleConfig(TelegramBotModuleConfig):
|
||||||
|
no_users_text = models.TextField(default='No users found')
|
||||||
|
message_template = models.TextField(default='{mentions}')
|
||||||
|
|
||||||
|
MODULE_NAME = 'Ping'
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def get_category(update: Update, name: str):
|
||||||
|
obj, created = PingBotCategory.objects.get_or_create(chat_id=update.effective_chat.id, cat_name=name)
|
||||||
|
return obj
|
||||||
|
|
||||||
|
def i_am_handler(self, update: Update, ctx: CallbackContext):
|
||||||
|
_, category = update.effective_message.text.split()
|
||||||
|
cat = self.get_category(update, category)
|
||||||
|
cat.add_user(update.effective_user.id)
|
||||||
|
cat.save()
|
||||||
|
update.effective_message.reply_text('Done')
|
||||||
|
|
||||||
|
def i_am_not_handler(self, update: Update, ctx: CallbackContext):
|
||||||
|
_, category = update.effective_message.text.split()
|
||||||
|
cat = self.get_category(update, category)
|
||||||
|
cat.remove_user(update.effective_user.id)
|
||||||
|
cat.save()
|
||||||
|
update.effective_message.reply_text('Done')
|
||||||
|
|
||||||
|
def ping_handler(self, update: Update, ctx: CallbackContext):
|
||||||
|
_, category = update.effective_message.text.split()
|
||||||
|
cat = self.get_category(update, category)
|
||||||
|
if not cat.user_ids:
|
||||||
|
return update.effective_message.reply_text(self.no_users_text)
|
||||||
|
mentions = []
|
||||||
|
for uid in cat.user_ids:
|
||||||
|
member = ctx.bot.get_chat_member(update.effective_chat.id, uid)
|
||||||
|
mentions.append(mention_html(uid, member.user.full_name))
|
||||||
|
update.effective_message.reply_markdown(self.message_template.format(mentions=' '.join(mentions)))
|
||||||
|
|
||||||
|
def categories_handler(self, update: Update, ctx: CallbackContext):
|
||||||
|
categories = []
|
||||||
|
for category in PingBotCategory.objects.filter(chat_id=update.effective_chat.id): # type: PingBotCategory
|
||||||
|
if category.user_ids:
|
||||||
|
categories.append('- {} ({})'.format(category.cat_name, len(category.user_ids)))
|
||||||
|
if not categories:
|
||||||
|
update.effective_message.reply_text('No categories for this chat')
|
||||||
|
else:
|
||||||
|
update.effective_message.reply_text('\n'.join(categories))
|
||||||
|
|
||||||
|
def build_dispatcher(self, dispatcher: Dispatcher):
|
||||||
|
dispatcher.add_handler(CommandHandler('iam', self.i_am_handler))
|
||||||
|
dispatcher.add_handler(CommandHandler('iamnot', self.i_am_not_handler))
|
||||||
|
dispatcher.add_handler(CommandHandler('ping', self.ping_handler))
|
||||||
|
dispatcher.add_handler(CommandHandler('categories', self.categories_handler))
|
||||||
|
return dispatcher
|
Loading…
Reference in New Issue
Block a user