bots/LogBot/logbot.py

167 lines
5.5 KiB
Python

from xbotlib import Bot
import jinja2
import os, re, json, shutil
import urllib.request
from urllib.parse import urlparse
local = './'
server = '/var/www/logs'
# output = local
output = server
def add_to_db(self, message, media_post=None):
keys = [x for x in self.db[message.room]['messages'].keys()]
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_file = 'index.html.j2' # Hmm... how to read the self.template ?
print('using the template: ', template_file)
template = jinja2.Template(open(template_file).read())
with open(f'{ output }/{ message.room }/index.html','w') as out:
html = template.render(title=self.db[message.room]['title'], db=self.db[message.room]['messages'])
out.write(html)
print('writing to: ', f'{ message.room }/index.html')
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)
if not os.path.isdir(f'{ output }/{ message.room }/{ media_type }'):
os.mkdir(f'{ output }/{ message.room }/{ media_type }')
with open(f'{ output }/{ message.room }/{ media_type }/{ filename }', 'wb') as media_file:
media_file.write(data)
media_file.close()
# define media_post
media_path = f'{ 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 group(self, message):
# create a folder + database item
# for each of the rooms in which
# logbot is hanging around :)
if not message.room in self.db.keys():
self.db[message.room] = {}
self.db[message.room]['messages'] = {}
self.db[message.room]['title'] = message.room
output_path = os.path.join(server, message.room)
if not os.path.isdir(output_path):
os.mkdir(output_path)
print('This folder is created:', output_path)
shutil.copy('stylesheet.css', output_path)
else:
print('WARNING! This folder already exists:', output_path)
# 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 '@help' in message.text:
print('HELP')
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()