A place for all our bot adventures.
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.

167 lines
5.5 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(self.room_path, 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('@','')
self.room_path = 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(self.room_path):
os.mkdir(self.room_path)
shutil.copy('stylesheet.css', self.room_path)
print('INFO ', f'Created a folder for: { room }')
print('INFO ', f'Copied stylesheet.css to: { room }')
print('INFO ', f'Output folder is set to: { self.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)
4 years ago
logbot()