mirror of
https://github.com/gryf/slack-backup.git
synced 2025-12-17 03:20:25 +01:00
Adjusted reporters to handle files attached to messages.
This commit is contained in:
2
setup.py
2
setup.py
@@ -10,7 +10,7 @@ except ImportError:
|
|||||||
|
|
||||||
setup(name="slack-backup",
|
setup(name="slack-backup",
|
||||||
packages=["slack_backup"],
|
packages=["slack_backup"],
|
||||||
version="0.7",
|
version="0.8",
|
||||||
description="Make copy of slack converstaions",
|
description="Make copy of slack converstaions",
|
||||||
author="Roman Dobosz",
|
author="Roman Dobosz",
|
||||||
author_email="gryf73@gmail.com",
|
author_email="gryf73@gmail.com",
|
||||||
|
|||||||
@@ -34,6 +34,7 @@ class Reporter(object):
|
|||||||
literal_url_pat = re.compile(r'(?P<replace>(?P<url>https?[^\s\|]+))')
|
literal_url_pat = re.compile(r'(?P<replace>(?P<url>https?[^\s\|]+))')
|
||||||
url_pat = re.compile(r'(?P<replace><(?P<url>http[^\|>]+)'
|
url_pat = re.compile(r'(?P<replace><(?P<url>http[^\|>]+)'
|
||||||
r'(\|(?P<title>[^>]+))?>)')
|
r'(\|(?P<title>[^>]+))?>)')
|
||||||
|
url2_pat = re.compile(r'<(?P<url>https?[^\s\|]+)>')
|
||||||
slackid_pat = re.compile(r'(?P<replace><@'
|
slackid_pat = re.compile(r'(?P<replace><@'
|
||||||
r'(?P<slackid>U[A-Z,0-9]+)(\|[^>]+)?[^>]*>)')
|
r'(?P<slackid>U[A-Z,0-9]+)(\|[^>]+)?[^>]*>)')
|
||||||
|
|
||||||
@@ -44,7 +45,7 @@ class Reporter(object):
|
|||||||
self.types = {"channel_join": self._msg_join,
|
self.types = {"channel_join": self._msg_join,
|
||||||
"channel_leave": self._msg_leave,
|
"channel_leave": self._msg_leave,
|
||||||
"channel_topic": self._msg_topic,
|
"channel_topic": self._msg_topic,
|
||||||
"file_share": self._msg_file,
|
# "file_share": self._msg_file,
|
||||||
"me_message": self._msg_me}
|
"me_message": self._msg_me}
|
||||||
|
|
||||||
self.emoji = emoji.EMOJI.get(args.theme, {})
|
self.emoji = emoji.EMOJI.get(args.theme, {})
|
||||||
@@ -66,18 +67,25 @@ class Reporter(object):
|
|||||||
filter(o.Message.channel == channel).\
|
filter(o.Message.channel == channel).\
|
||||||
order_by(o.Message.ts).all():
|
order_by(o.Message.ts).all():
|
||||||
messages.append(message)
|
messages.append(message)
|
||||||
self.write_msg(messages, log_path)
|
self.write_msg(messages, log_path, channel)
|
||||||
|
|
||||||
def get_log_path(self, name):
|
def get_log_path(self, name):
|
||||||
"""Return relative log file name """
|
"""Return relative log file name """
|
||||||
return os.path.join(self.out, name + self.ext)
|
return os.path.join(self.out, name + self.ext)
|
||||||
|
|
||||||
def write_msg(self, messages, log):
|
def write_msg(self, messages, log, channel):
|
||||||
"""Write message to file"""
|
"""Write message to file"""
|
||||||
with open(log, "a", encoding='utf8') as fobj:
|
with open(log, "a", encoding='utf8') as fobj:
|
||||||
for message in messages:
|
for message in messages:
|
||||||
data = self._process_message(message)
|
data = self._process_message(message)
|
||||||
fobj.write(data['tpl'].format(**data))
|
fobj.write(data['tpl'].format(**data))
|
||||||
|
if message.files:
|
||||||
|
for _file in message.files:
|
||||||
|
data = self._msg_file(message, _file)
|
||||||
|
fobj.write(data['tpl'].format(**data))
|
||||||
|
# else:
|
||||||
|
# data = self._process_message(message)
|
||||||
|
# fobj.write(data['tpl'].format(**data))
|
||||||
|
|
||||||
def _get_symbol(self, item):
|
def _get_symbol(self, item):
|
||||||
"""Return appropriate item depending on the selected theme"""
|
"""Return appropriate item depending on the selected theme"""
|
||||||
@@ -134,7 +142,7 @@ class Reporter(object):
|
|||||||
return {'msg': msg.user.name + ' ' + msg.text,
|
return {'msg': msg.user.name + ' ' + msg.text,
|
||||||
'nick': self._get_symbol('me')}
|
'nick': self._get_symbol('me')}
|
||||||
|
|
||||||
def _msg_file(self, msg):
|
def _msg_file(self, msg, _file):
|
||||||
"""return data for file"""
|
"""return data for file"""
|
||||||
return {'msg': msg.text,
|
return {'msg': msg.text,
|
||||||
'nick': self._get_symbol('file')}
|
'nick': self._get_symbol('file')}
|
||||||
@@ -194,7 +202,7 @@ class TextReporter(Reporter):
|
|||||||
order_by(o.Message.ts).all():
|
order_by(o.Message.ts).all():
|
||||||
messages.append(message)
|
messages.append(message)
|
||||||
|
|
||||||
self.write_msg(messages, log_path)
|
self.write_msg(messages, log_path, channel)
|
||||||
|
|
||||||
def _set_max_len(self, channel):
|
def _set_max_len(self, channel):
|
||||||
"""calculate max_len for sepcified channel"""
|
"""calculate max_len for sepcified channel"""
|
||||||
@@ -221,17 +229,20 @@ class TextReporter(Reporter):
|
|||||||
'tpl': self.tpl})
|
'tpl': self.tpl})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def _msg_file(self, msg):
|
def _msg_file(self, message, _file):
|
||||||
"""return data for file"""
|
"""return data for file"""
|
||||||
if msg.file.filepath:
|
if _file.filepath:
|
||||||
fpath = os.path.abspath(msg.file.filepath)
|
fpath = os.path.abspath(_file.filepath)
|
||||||
fpath = pathlib.PurePath(fpath).as_uri()
|
fpath = pathlib.PurePath(fpath).as_uri()
|
||||||
else:
|
else:
|
||||||
fpath = 'does_not_exists'
|
fpath = 'does_not_exists'
|
||||||
|
|
||||||
return {'msg': self.url_pat.sub('(' + fpath + ') ' + msg.file.title,
|
return {'msg': _file.title + ' ' + fpath,
|
||||||
msg.text),
|
'nick': self._get_symbol('file'),
|
||||||
'nick': self._get_symbol('file')}
|
'date': message.datetime().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
|
'max_len': self._max_len,
|
||||||
|
'separator': self._get_symbol('separator'),
|
||||||
|
'tpl': self.tpl}
|
||||||
|
|
||||||
def _msg(self, msg):
|
def _msg(self, msg):
|
||||||
"""return data for all other message types"""
|
"""return data for all other message types"""
|
||||||
@@ -293,7 +304,9 @@ class StaticHtmlReporter(Reporter):
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
|
<meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
|
||||||
<title>Bla</title>
|
<title>%(title)s</title>
|
||||||
|
"""
|
||||||
|
msg_style = """
|
||||||
<style>
|
<style>
|
||||||
* {
|
* {
|
||||||
font-family: sans-serif;
|
font-family: sans-serif;
|
||||||
@@ -314,6 +327,10 @@ class StaticHtmlReporter(Reporter):
|
|||||||
td {
|
td {
|
||||||
padding: 2px;
|
padding: 2px;
|
||||||
}
|
}
|
||||||
|
img {
|
||||||
|
max-height: 300px;
|
||||||
|
max-widht: 500px;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
@@ -349,12 +366,16 @@ class StaticHtmlReporter(Reporter):
|
|||||||
'msgs': self.index_list % self._get_index_list()}
|
'msgs': self.index_list % self._get_index_list()}
|
||||||
fobj.write(self.index_templ % content)
|
fobj.write(self.index_templ % content)
|
||||||
|
|
||||||
def write_msg(self, messages, log):
|
def write_msg(self, messages, log, channel):
|
||||||
"""Write message to file"""
|
"""Write message to file"""
|
||||||
with open(log, "w", encoding='utf8') as fobj:
|
with open(log, "w", encoding='utf8') as fobj:
|
||||||
fobj.write(self.msg_head)
|
title = channel.name
|
||||||
|
if channel.topic:
|
||||||
|
title = channel.name + ' ' + channel.topic.value
|
||||||
|
fobj.write(self.msg_head % {'title': title})
|
||||||
|
fobj.write(self.msg_style)
|
||||||
|
|
||||||
super(StaticHtmlReporter, self).write_msg(messages, log)
|
super(StaticHtmlReporter, self).write_msg(messages, log, channel)
|
||||||
|
|
||||||
with open(log, "a", encoding='utf8') as fobj:
|
with open(log, "a", encoding='utf8') as fobj:
|
||||||
fobj.write(self.msg_foot)
|
fobj.write(self.msg_foot)
|
||||||
@@ -377,29 +398,46 @@ class StaticHtmlReporter(Reporter):
|
|||||||
'tpl': self.msg_line})
|
'tpl': self.msg_line})
|
||||||
return data
|
return data
|
||||||
|
|
||||||
def _msg_file(self, msg):
|
def _msg_file(self, msg, _file):
|
||||||
"""return data for file"""
|
"""return data for file"""
|
||||||
if msg.file.filepath:
|
if _file.filepath:
|
||||||
fpath = os.path.abspath(msg.file.filepath)
|
fpath = os.path.abspath(_file.filepath)
|
||||||
fpath = pathlib.PurePath(fpath).as_uri()
|
fpath = pathlib.PurePath(fpath).as_uri()
|
||||||
else:
|
else:
|
||||||
fpath = 'does_not_exists'
|
fpath = 'does_not_exists'
|
||||||
|
|
||||||
_, ext = os.path.splitext(fpath)
|
_, ext = os.path.splitext(fpath)
|
||||||
if ext.lower() in ('.png', '.jpg', '.jpeg', '.gif'):
|
if ext.lower() in ('.png', '.jpg', '.jpeg', '.gif'):
|
||||||
url = ('<img src="' + fpath + '" height="300" alt="' +
|
url = ('<img src="' + fpath + '" alt="' +
|
||||||
msg.file.title + '">')
|
_file.title + '">')
|
||||||
else:
|
else:
|
||||||
url = ('<a href="' + fpath + '">' + msg.file.title + '</a>')
|
url = ('<a href="' + fpath + '">' + _file.title + '</a>')
|
||||||
|
|
||||||
return {'msg': self.url_pat.sub(url, msg.text),
|
data = {'date': msg.datetime().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
|
'msg': self._filter_slackid(url + _file.title),
|
||||||
|
'tpl': self.msg_line,
|
||||||
'nick': self._get_symbol('file')}
|
'nick': self._get_symbol('file')}
|
||||||
|
|
||||||
|
for emoticon in self.emoji:
|
||||||
|
data['msg'] = data['msg'].replace(emoticon, self.emoji[emoticon])
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
def _msg(self, msg):
|
def _msg(self, msg):
|
||||||
"""return processor for all other message types"""
|
"""return processor for all other message types"""
|
||||||
|
|
||||||
|
match = self.url2_pat.match(msg.text)
|
||||||
|
text = msg.text
|
||||||
|
if match:
|
||||||
|
text = ''
|
||||||
|
for part in self.url2_pat.split(msg.text):
|
||||||
|
if 'http' in part:
|
||||||
|
text += '<a href="' + part + '">' + part + '</a>'
|
||||||
|
else:
|
||||||
|
text += part
|
||||||
|
|
||||||
data = {'date': msg.datetime().strftime("%Y-%m-%d %H:%M:%S"),
|
data = {'date': msg.datetime().strftime("%Y-%m-%d %H:%M:%S"),
|
||||||
'msg': msg.text,
|
'msg': text,
|
||||||
'nick': msg.user.name}
|
'nick': msg.user.name}
|
||||||
|
|
||||||
link = '<a href="{url}">{title}</a>'
|
link = '<a href="{url}">{title}</a>'
|
||||||
|
|||||||
Reference in New Issue
Block a user