Move functions under the class to unify self usage

This commit is contained in:
Luke Murphy 2021-02-27 11:38:28 +01:00
parent d41e4b80bd
commit 623f2c8bb5
No known key found for this signature in database
GPG Key ID: 5E2EF5A63E3718CC

View File

@ -7,127 +7,125 @@ from urllib.parse import urlparse
import jinja2 import jinja2
from xbotlib import Bot from xbotlib import Bot
IMAGE_TYPES = (".jpg", "jpeg", "png", ".gif", ".bmp", ".svg", "eps")
AUDIO_TYPES = (".mp3", ".ogg", ".oga", ".mogg", ".wav", ".m4a", ".webm")
FILE_TYPES = ".pdf"
VIDEO_TYPES = (
".mp4",
".webm",
".flv",
".vob",
".avi",
".mov",
".qt",
".mpg",
".mpeg",
".mp4",
".m2v",
".mpe",
".3gp",
)
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, logger):
template = jinja2.Template(open("template.html").read())
roomname = re.sub(r"@.*", "", message.room)
log_path = os.path.join(self.output, roomname, "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)
logger.info("writing to: ", log_path)
def download(self, message, logger):
# define media_type
if message.url.lower().endswith(IMAGE_TYPES):
media_type = "images"
elif message.url.lower().endswith(FILE_TYPES):
media_type = "pdf"
elif message.url.lower().endswith(AUDIO_TYPES):
media_type = "audio"
elif message.url.lower().endswith(VIDEO_TYPES):
media_type = "video"
else:
media_type = None
logger.info(f"Unable to determine media type of {message.url.lower()}")
# download file
data = urllib.request.urlopen(message.url).read()
if data:
logger.info("downloading: ", message.url)
parsed_url = urlparse(message.url)
filename = (
os.path.basename(parsed_url.path).replace(" ", "_").replace("%20", "_")
) # safe url's
self.log.info("as the file: ", filename)
roomname = re.sub(r"@.*", "", message.room)
path = os.path.join(self.output, roomname, 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)
# define media_post
media_path = os.path.join(media_type, filename)
if message.url.lower().endswith(IMAGE_TYPES):
media_post = f'<img src="{ media_path }">'
elif message.url.lower().endswith(FILE_TYPES):
media_post = f'<iframe src="{ media_path }" width="800" height="1000"></iframe>'
elif message.url.lower().endswith(AUDIO_TYPES):
media_post = f'<audio controls src="{ media_path }"></audio>'
elif message.url.lower().endswith(VIDEO_TYPES):
media_post = f'<video controls src="{ media_path }"></video>'
else:
media_post = None
return media_post, media_type
class Logbot(Bot): class Logbot(Bot):
help = """Oh dear, logbot is here! help = """Oh dear, logbot is here!
(You can speak to the bot using @logbot or logbot:)
(You can speak to the bot using @logbot or logbot:) <image>: Your image is added to the log.
<image>: Your image is added to the log. logbot @help: Print this message
logbot @help: Print this message logbot @add <message>: Add a message to the log.
logbot @add <message>: Add a message to the log. logbot @delete <num>: Delete posts from the log. For example: @logbot @delete 5
logbot @delete <num>: Delete posts from the log. For example: @logbot @delete 5 logbot @title <string>: Set the title of your log.
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 @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
logbot @uptime: To check how long @logbot has been around @bots: To see who is around :)
""" # noqa
@bots: To see who is around :) IMAGE_TYPES = (".jpg", "jpeg", "png", ".gif", ".bmp", ".svg", "eps")
"""
AUDIO_TYPES = (".mp3", ".ogg", ".oga", ".mogg", ".wav", ".m4a", ".webm")
FILE_TYPES = ".pdf"
VIDEO_TYPES = (
".mp4",
".webm",
".flv",
".vob",
".avi",
".mov",
".qt",
".mpg",
".mpeg",
".mp4",
".m2v",
".mpe",
".3gp",
)
def _download(self, message):
# define media_type
if message.url.lower().endswith(self.IMAGE_TYPES):
media_type = "images"
elif message.url.lower().endswith(self.FILE_TYPES):
media_type = "pdf"
elif message.url.lower().endswith(self.AUDIO_TYPES):
media_type = "audio"
elif message.url.lower().endswith(self.VIDEO_TYPES):
media_type = "video"
else:
media_type = None
self.log.info(f"Unable to determine media type of {message.url.lower()}")
# download file
data = urllib.request.urlopen(message.url).read()
if data:
self.log.info("downloading: ", message.url)
parsed_url = urlparse(message.url)
filename = (
os.path.basename(parsed_url.path).replace(" ", "_").replace("%20", "_")
) # safe url's
self.log.info("as the file: ", filename)
roomname = re.sub(r"@.*", "", message.room)
path = os.path.join(self.output, roomname, 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)
# define media_post
media_path = os.path.join(media_type, filename)
if message.url.lower().endswith(self.IMAGE_TYPES):
media_post = f'<img src="{ media_path }">'
elif message.url.lower().endswith(self.FILE_TYPES):
media_post = (
f'<iframe src="{ media_path }" width="800" height="1000"></iframe>'
)
elif message.url.lower().endswith(self.AUDIO_TYPES):
media_post = f'<audio controls src="{ media_path }"></audio>'
elif message.url.lower().endswith(self.VIDEO_TYPES):
media_post = f'<video controls src="{ media_path }"></video>'
else:
media_post = None
return media_post, media_type
def _write_log(self, message):
"""Write new log to the file system."""
template = jinja2.Template(open("template.html").read())
room_name = self._parse_room_name(message.room)
log_path = os.path.join(self.output, room_name, "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)
self.log.info("writing to: ", log_path)
def _add_to_db(self, message, media_post=None):
"""Save new entry to database."""
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:
replaced = message.content.replace("@add", "")
self.db[message.room]["messages"][new_key] = replaced
def _parse_room_name(self, room): def _parse_room_name(self, room):
"""Parse room name from entire address string.""" """Parse room name from entire address string."""
@ -171,16 +169,16 @@ logbot @uptime: To check how long @logbot has been around
# image / PDF / audio / video # image / PDF / audio / video
if message.url: if message.url:
media_post, media_type = download(self, message, self.log) media_post, media_type = self._download(message, self.log)
if media_post: if media_post:
add_to_db(self, message, media_post=media_post) self._add_to_db(message, media_post=media_post)
media_type = media_type.replace("images", "image") # linguistic hack! media_type = media_type.replace("images", "image") # linguistic hack!
reply = f"Thanks for that { media_type }!" reply = f"Thanks for that { media_type }!"
else: else:
reply = "Sorry, can't process that :( (unknown media type?)" reply = "Sorry, can't process that :( (unknown media type?)"
elif "@add" in message.text: elif "@add" in message.text:
add_to_db(self, message) self._add_to_db(message)
reply = "Added, thanks!" reply = "Added, thanks!"
elif "@delete" in message.text: elif "@delete" in message.text:
@ -190,7 +188,7 @@ logbot @uptime: To check how long @logbot has been around
if key in self.db[message.room]["messages"]: if key in self.db[message.room]["messages"]:
self.log.info("To be deleted:", self.db[message.room]["messages"][key]) self.log.info("To be deleted:", self.db[message.room]["messages"][key])
reply = f"This message is 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) del self.db[message.room]["messages"][key]
else: else:
reply = "This message is already gone!" reply = "This message is already gone!"
@ -206,7 +204,7 @@ logbot @uptime: To check how long @logbot has been around
else: else:
reply = "Hmm ... not sure what you want to do?" reply = "Hmm ... not sure what you want to do?"
write_log(self, message, self.log) self._write_log(message, self.log)
self.reply(reply, room=message.room) self.reply(reply, room=message.room)