implement bots
This commit is contained in:
87
bots/modules/channel_helper.py
Normal file
87
bots/modules/channel_helper.py
Normal file
@@ -0,0 +1,87 @@
|
||||
import base64
|
||||
import os
|
||||
import tempfile
|
||||
from io import BytesIO
|
||||
from uuid import uuid4
|
||||
|
||||
import requests
|
||||
from PIL import Image
|
||||
from django.db import models
|
||||
from telegram import Update
|
||||
from telegram.ext import Dispatcher, CallbackContext, MessageHandler, Filters
|
||||
from jsonrpc import Dispatcher as RPCDispatcher
|
||||
|
||||
from bots.models import TelegramBotModuleConfig
|
||||
|
||||
|
||||
class ChannelHelperBotModuleConfig(TelegramBotModuleConfig):
|
||||
chat_id = models.CharField(max_length=32)
|
||||
|
||||
MODULE_NAME = 'Channel helper'
|
||||
|
||||
rpc_dispatcher = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.rpc_dispatcher = RPCDispatcher()
|
||||
self.rpc_dispatcher['post_photo'] = self.rpc_post_photo
|
||||
|
||||
def rpc_post_photo(self, photo, is_base64=False):
|
||||
try:
|
||||
if is_base64:
|
||||
f = BytesIO(base64.b64decode(photo))
|
||||
else:
|
||||
resp = requests.get(photo)
|
||||
resp.raise_for_status()
|
||||
f = BytesIO(resp.content)
|
||||
except:
|
||||
raise RuntimeError('Could not load image')
|
||||
im = Image.open(f) # type: Image.Image
|
||||
width, height = im.size
|
||||
if width > 2000 or height > 2000:
|
||||
im.thumbnail((2000, 2000))
|
||||
with tempfile.TemporaryDirectory() as d:
|
||||
fpath = os.path.join(d, '{}.jpg'.format(uuid4()))
|
||||
im.save(fpath)
|
||||
self.bot.get_bot().send_photo(self.chat_id, open(fpath, 'rb'))
|
||||
return True
|
||||
|
||||
def handle_message(self, update: Update, ctx: CallbackContext):
|
||||
m = update.effective_message
|
||||
bot = ctx.bot
|
||||
if hasattr(m, 'audio') and m.audio:
|
||||
a = m.audio
|
||||
r = bot.send_audio(self.chat_id, a.file_id, a.duration, a.performer, a.title)
|
||||
elif hasattr(m, 'document') and m.document:
|
||||
d = m.document
|
||||
r = bot.send_document(self.chat_id, d.file_id, d.file_name)
|
||||
elif hasattr(m, 'photo') and m.photo:
|
||||
p = m.photo
|
||||
r = bot.send_photo(self.chat_id, p[-1].file_id)
|
||||
elif hasattr(m, 'sticker') and m.sticker:
|
||||
s = m.sticker
|
||||
r = bot.send_sticker(self.chat_id, s.file_id)
|
||||
elif hasattr(m, 'video') and m.video:
|
||||
v = m.video
|
||||
r = bot.send_video(self.chat_id, v.file_id, v.duration)
|
||||
elif hasattr(m, 'voice') and m.voice:
|
||||
v = m.voice
|
||||
r = bot.send_voice(self.chat_id, v.file_id, v.duration)
|
||||
elif hasattr(m, 'video_note') and m.video_note:
|
||||
vn = m.video_note
|
||||
r = bot.send_video_note(self.chat_id, vn.file_id, vn.duration, vn.length)
|
||||
elif hasattr(m, 'contact') and m.contact:
|
||||
c = m.contact
|
||||
r = bot.send_contact(self.chat_id, c.phone_number, c.first_name, c.last_name)
|
||||
elif hasattr(m, 'location') and m.location:
|
||||
l = m.location
|
||||
r = bot.send_location(self.chat_id, l.latitude, l.longitude)
|
||||
elif hasattr(m, 'venue') and m.venue:
|
||||
v = m.venue
|
||||
r = bot.send_venue(self.chat_id, v.location.latitude, v.location.longitude, v.title, v.address, v.foursquare_id)
|
||||
elif hasattr(m, 'text') and m.text:
|
||||
r = bot.send_message(self.chat_id, m.text_html, 'html')
|
||||
|
||||
def build_dispatcher(self, dispatcher: Dispatcher):
|
||||
dispatcher.add_handler(MessageHandler(Filters.all, self.handle_message))
|
||||
return dispatcher
|
Reference in New Issue
Block a user