forked from varia/bots
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
166 lines
5.4 KiB
166 lines
5.4 KiB
from xbotlib import Bot
|
|
import jinja2
|
|
import os, re, json, shutil
|
|
from os import environ
|
|
import urllib.request
|
|
from urllib.parse import urlparse
|
|
|
|
def add_to_db(self, message, media_post=None):
|
|
keys = [x for x in self.db[message.room]['messages'].keys()]
|
|
keys.sort(key=int)
|
|
if not keys:
|
|
new_key = "0"
|
|
else:
|
|
new_key = str(int(keys[-1]) + 1)
|
|
if media_post:
|
|
self.db[message.room]['messages'][new_key] = media_post
|
|
else:
|
|
self.db[message.room]['messages'][new_key] = message.content.replace('@add','')
|
|
|
|
def del_from_db(self, message, key):
|
|
del self.db[message.room]['messages'][key]
|
|
|
|
def write_log(self, message):
|
|
template = jinja2.Template(open('template.html').read())
|
|
log_path = os.path.join(output, message.room, 'index.html')
|
|
with open(log_path,'w') as out:
|
|
html = template.render(title=self.db[message.room]['title'], db=self.db[message.room]['messages'])
|
|
out.write(html)
|
|
print('writing to: ', log_path)
|
|
|
|
def download(message):
|
|
# define media_type
|
|
if message.url.lower().endswith(('.jpg','jpeg','png','.gif','.bmp','.svg','eps')):
|
|
media_type = 'images'
|
|
elif message.url.lower().endswith('.pdf'):
|
|
media_type = 'pdf'
|
|
elif message.url.lower().endswith(('.mp3','.ogg','.oga','.mogg','.wav','.m4a','.webm')):
|
|
media_type = 'audio'
|
|
elif message.url.lower().endswith(('.mp4','.webm','.flv','.vob','.avi','.mov','.qt','.mpg','.mpeg','.mp4','.m2v','.mpe','.3gp')):
|
|
media_type = 'video'
|
|
else:
|
|
media_type = None
|
|
|
|
# download file
|
|
data = urllib.request.urlopen(message.url).read()
|
|
if data:
|
|
print('downloading: ', message.url)
|
|
parsed_url = urlparse(message.url)
|
|
filename = os.path.basename(parsed_url.path).replace(' ','_').replace('%20','_') # safe url's
|
|
print('as the file: ', filename)
|
|
path = os.path.join(output, message.room, media_type)
|
|
if not os.path.isdir(path):
|
|
os.mkdir(path)
|
|
file_path = os.path.join(path, filename)
|
|
with open(file_path, 'wb') as media_file:
|
|
media_file.write(data)
|
|
media_file.close()
|
|
|
|
# define media_post
|
|
media_path = os.path.join(media_type, filename)
|
|
if message.url.lower().endswith(('.jpg','jpeg','png','.gif','.bmp','.svg','eps')):
|
|
media_post = f'<img src="{ media_path }">'
|
|
elif message.url.lower().endswith('.pdf'):
|
|
media_post = f'<iframe src="{ media_path }" width="800" height="1000"></iframe>'
|
|
elif message.url.lower().endswith(('.mp3','.ogg','.oga','.mogg','.wav','.m4a','.webm')):
|
|
media_post = f'<audio controls src="{ media_path }"></audio>'
|
|
elif message.url.lower().endswith(('.mp4','.webm','.flv','.vob','.avi','.mov','.qt','.mpg','.mpeg','.mp4','.m2v','.mpe','.3gp')):
|
|
media_post = f'<video controls src="{ media_path }"></video>'
|
|
else:
|
|
media_post = None
|
|
|
|
return media_post, media_type
|
|
|
|
class logbot(Bot):
|
|
|
|
help = '''Oh dear, logbot is here!
|
|
|
|
(You can speak to the bot using @logbot or logbot:)
|
|
|
|
<image>: Your image is added to the log.
|
|
|
|
logbot @help: Print this message
|
|
|
|
logbot @add <message>: Add a message to the log.
|
|
|
|
logbot @delete <num>: Delete posts from the log. For example: @logbot @delete 5
|
|
|
|
logbot @title <string>: Set the title of your log.
|
|
|
|
logbot @style <element> <css-rule>: Edit the css of your log. For example: logbot @style body background-color: pink; [future-feature]
|
|
|
|
logbot @uptime: To check how long @logbot has been around
|
|
|
|
@bots: To see who is around :)
|
|
'''
|
|
def setup(self):
|
|
for room in self.rooms:
|
|
|
|
roomname = str(re.match(r'.*@', room).group()).replace('@','')
|
|
output = os.path.join(self.output, roomname)
|
|
|
|
# Check if the room is in the database already
|
|
if not room in self.db.keys():
|
|
self.db[room] = {}
|
|
self.db[room]['messages'] = {}
|
|
self.db[room]['title'] = room
|
|
print('INFO ', f'Added to the database: { room }')
|
|
|
|
# Check if the room has an output folder already
|
|
if not os.path.exists(output):
|
|
os.mkdir(output)
|
|
shutil.copy('stylesheet.css', output)
|
|
print('INFO ', f'Created a folder for: { room }')
|
|
print('INFO ', f'Copied stylesheet.css to: { room }')
|
|
|
|
print('INFO ', f'Output folder is set to: { output }')
|
|
|
|
def group(self, message):
|
|
|
|
# to debug in the terminal
|
|
print('------------------')
|
|
print('message: ', message.text)
|
|
print('room: ', message.room)
|
|
print('sender: ', message.sender)
|
|
|
|
# image / PDF / audio / video
|
|
if message.url:
|
|
media_post, media_type = download(message)
|
|
if media_post:
|
|
add_to_db(self, message, media_post=media_post)
|
|
media_type = media_type.replace('images', 'image') # linguistic hack!
|
|
reply = f'Thanks for that { media_type }!'
|
|
else:
|
|
reply = 'Sorry, can\'t touch that :('
|
|
|
|
elif '@add' in message.text:
|
|
add_to_db(self, message)
|
|
reply = 'Added, thanks!'
|
|
|
|
elif '@delete' in message.text:
|
|
match = re.findall("@delete \d*", message.content)[0]
|
|
key = str(match.replace('@delete ',''))
|
|
|
|
if key in self.db[message.room]['messages']:
|
|
print('To be deleted:', self.db[message.room]['messages'][key])
|
|
reply = f"This message is deleted: { self.db[message.room]['messages'][key] }"
|
|
del_from_db(self, message, key)
|
|
else:
|
|
reply = 'This message is already gone!'
|
|
|
|
elif '@title' in message.text:
|
|
match = re.findall("@title .*", message.content)[0]
|
|
title = match.replace('@title','')
|
|
self.db[message.room]['title'] = title
|
|
reply = f'The title of the log is changed to: { title }'
|
|
|
|
elif '@style' in message.text:
|
|
reply = 'This is a future-feature ...'
|
|
|
|
else:
|
|
reply = 'Hmm ... not sure what you want to do?'
|
|
|
|
write_log(self, message)
|
|
return self.reply(reply, room=message.room)
|
|
|
|
logbot()
|
|
|