diff options
author | diSabler <dissy@ya.ru> | 2017-07-30 19:09:13 +0300 |
---|---|---|
committer | diSabler <dissy@ya.ru> | 2017-07-30 19:09:13 +0300 |
commit | a0a67e85a2027c2fe76ee6bcab7c708fb0de3a3c (patch) | |
tree | 366e6522a5f14718aaed67cb222b803238ac2b41 | |
parent | c2798fb8dd5b694d71a366f8a2246d4bef0c8fcf (diff) |
add: chatlogs!
fix: drink plugin
upd: error plugin
-rw-r--r-- | .gitignore | 3 | ||||
-rw-r--r-- | data/chatlog/.css/chatlog.css | 121 | ||||
-rw-r--r-- | kernel.py | 8 | ||||
-rw-r--r-- | plugins/drink.py | 22 | ||||
-rw-r--r-- | plugins/error.py | 2 | ||||
-rw-r--r-- | plugins/logger.py | 178 | ||||
-rw-r--r-- | settings/config.ini.demo | 4 |
7 files changed, 324 insertions, 14 deletions
@@ -95,4 +95,7 @@ data/tmp/version plugins/_*.py desktop.ini +data/chatlog/-[0-9]* +data/chatlog/[0-9]* + # The end is near! diff --git a/data/chatlog/.css/chatlog.css b/data/chatlog/.css/chatlog.css new file mode 100644 index 0000000..19f6c6e --- /dev/null +++ b/data/chatlog/.css/chatlog.css @@ -0,0 +1,121 @@ +* { + font-family: "Segoe UI"; + font-size: 14px; + padding: 0px; + margin: 0px +} + +body { + background-image: url('data:image/gif;base64,R0lGODlhBQAFAIAAAOfn5/r6+iH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS4wLWMwNjAgNjEuMTM0Nzc3LCAyMDEwLzAyLzEyLTE3OjMyOjAwICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M1IFdpbmRvd3MiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NTM1NUY3OTA2QTU3MTFERjgyQTRCRTc2NDcxM0Q3MEYiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NTM1NUY3OTE2QTU3MTFERjgyQTRCRTc2NDcxM0Q3MEYiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDo1MzU1Rjc4RTZBNTcxMURGODJBNEJFNzY0NzEzRDcwRiIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo1MzU1Rjc4RjZBNTcxMURGODJBNEJFNzY0NzEzRDcwRiIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PgH//v38+/r5+Pf29fTz8vHw7+7t7Ovq6ejn5uXk4+Lh4N/e3dzb2tnY19bV1NPS0dDPzs3My8rJyMfGxcTDwsHAv769vLu6ubi3trW0s7KxsK+urayrqqmop6alpKOioaCfnp2cm5qZmJeWlZSTkpGQj46NjIuKiYiHhoWEg4KBgH9+fXx7enl4d3Z1dHNycXBvbm1sa2ppaGdmZWRjYmFgX15dXFtaWVhXVlVUU1JRUE9OTUxLSklIR0ZFRENCQUA/Pj08Ozo5ODc2NTQzMjEwLy4tLCsqKSgnJiUkIyIhIB8eHRwbGhkYFxYVFBMSERAPDg0MCwoJCAcGBQQDAgEAACH5BAAAAAAALAAAAAAFAAUAAAIHjAOXtqgXCgA7'); +} + +.link { + float: right; +} + +.main { + margin-left: 16px; + margin-right: 16px; + margin-top: 8px; + margin-bottom: 8px; +} + +a { + text-decoration: none; + color: #6f94d1; + } + +a:hover{ + text-decoration: none; + color: #9e4573 +} + +.title-link { + color: #6f94d1; + font-size: 14px; +} + +.top { + height: 22px; + line-height: 22px; +} + +.chat { + color: #6f94d1; + font-size: 14px; + padding-left: 8px; + background: #000; + border-top-left-radius: 8px; + border-top-right-radius: 8px; +} + +.link { + padding-right: 8px; +} + +.container { + background-color: #fafafa; + border-color: #706a6c; + border-left: 1px solid #706a6c; + border-right: 1px solid #706a6c; + border-bottom: 1px solid #706a6c; + padding: 0px 4px; +} + +.time { + color: #003871; +} + +.user { + font-weight: bold; + color: #535c68; +} + +.user-join { + font-weight: bold; + color: #57a478; + font-style: italic; +} + +.user-leave { + font-weight: bold; + color: #7396a4; + font-style: italic; +} + +.name { + color: #7396a4; + font-style: italic; +} + +.text { + color: #000; + padding-left: 4px; + padding-right: 4px; +} + +.text-join { + color: #57a478; + padding-left: 4px; + padding-right: 4px; + font-style: italic; +} + +.text-leave { + color: #7396a4; + padding-left: 4px; + padding-right: 4px; + font-style: italic; +} + +pre { + display: block; + font-family: monospace; + white-space: pre; + margin: 0px; + color: #57a478; +} + +.image { + border-radius: 8px; +} @@ -455,9 +455,9 @@ def remove_sub_space(t): # Send request
def send_raw(raw_in, method, dt, fl={}):
- global LAST_MESSAGE
+ if LOGGER:
+ logger_self(dt)
request = requests.post(API_URL % method, data=dt, files = fl)
- LAST_MESSAGE = time.time()
if not request.status_code == 200:
pprint('*** Error code on %s: %s' % (method, request.status_code), 'red')
pprint('Raw_in dump:\n%s' % json.dumps(raw_in, indent=2, separators=(',', ': ')), 'red')
@@ -576,6 +576,8 @@ def check_updates(): CHAT_ID = msg_in['message']['chat'].get('id', 0)
except:
CHAT_ID = 0
+ if LOGGER:
+ logger(msg_in)
if msg_in.has_key('edited_message'):
msg_in['message'] = msg_in['edited_message']
pprint('*** Edited message!', 'yellow')
@@ -832,12 +834,12 @@ user_agent = 'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KH # # User agent for web requests
TIMEOUT = 1 # Timeout between request updates
MAX_TIMEOUT = 15 # Maximal timeout after request error
-LAST_MESSAGE = time.time() # Last message time
CYCLES = 0 # Work cycles
THREAD_COUNT = 0 # Executed threads
THREAD_ERROR_COUNT = 0 # Threads with error
GAME_OVER = False # Bot's status
BOT_EXIT_TYPE = '' # Reason for bot's kernel exit
+LOGGER = False # Logger plugin
# --- Init ------------------------------------------------------------------- #
try:
diff --git a/plugins/drink.py b/plugins/drink.py index 37650cc..8d79dcc 100644 --- a/plugins/drink.py +++ b/plugins/drink.py @@ -28,20 +28,20 @@ def cmd_to_drink(raw_in, text): 'nineteenth', 'twentieth', 'twenty-first', 'twenty-second', 'twenty-third',
'twenty-fourth', 'twenty-fifth', 'twenty-sixth', 'twenty-seventh',
'twenty-eighth', 'twenty-nineth', 'thirtieth', 'thirty-first']
- drink_mmas1 = ['january', 'february', 'march', 'april', 'may', 'june', 'july',
- 'august', 'september', 'october', 'november', 'december']
- drink_mmas2 = ['January', 'February', 'March', 'April', 'May', 'June', 'July',
- 'August', 'September', 'October', 'November', 'December']
- drink_wday = ['monday', 'tuesday', 'wendesday', 'thirsday', 'friday',
- 'saturday', 'sunday']
- drink_lday = ['last', 'last', 'Last', 'last', 'Last', 'Last', 'lAst']
+ drink_mmas1 = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль',
+ 'авгест', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь']
+ drink_mmas2 = ['января', 'февраля', 'марта', 'апреля', 'мая', 'июня', 'июля',
+ 'августа', 'сентября', 'октября', 'ноября', 'декабря']
+ drink_wday = ['понедельник', 'вторник', 'среда', 'четверг', 'пятница',
+ 'суббота', 'воскресенье']
+ drink_lday = ['последний', 'последний', 'последняя', 'последний', 'последняя', 'последняя', 'последнее']
date_file = DATA_FOLDER % 'date.txt'
if os.path.isfile(date_file):
ddate = readfile(date_file).decode('UTF')
week1 = ''
week2 = ''
if not ddate:
- msg = 'Read file error.'
+ msg = 'Ошибка чтения!'
else:
if len(text) <= 2:
ltim = tuple(time.localtime())
@@ -80,11 +80,11 @@ def cmd_to_drink(raw_in, text): except:
pass
if msg == '':
- msg = 'Holiday: %s not found.' % or_text
+ msg = 'Повод: %s не найден.' % or_text
else:
- msg = 'I know holidays: %s' % msg
+ msg = 'Я знаю поводы: %s' % msg
else:
- msg = 'Database doesn\'t exist.'
+ msg = 'База не найдена.'
send_msg(raw_in, msg)
def cmd_calend(raw_in, text):
diff --git a/plugins/error.py b/plugins/error.py index 1fe7b10..ded25f8 100644 --- a/plugins/error.py +++ b/plugins/error.py @@ -39,6 +39,8 @@ def cmd_show_error(raw_in, text): if text != '': msg += '\n%s' % '\n'.join('<pre>%s</pre>' % html_escape_soft(t) \ for t in log[log_len-cmd:log_len]) + else: + msg += '\nLast error: /error_1' else: msg = '👍🏻 No Errors!' else: diff --git a/plugins/logger.py b/plugins/logger.py new file mode 100644 index 0000000..3e01ee1 --- /dev/null +++ b/plugins/logger.py @@ -0,0 +1,178 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- + +# --------------------------------------------------------------------------- # +# # +# iSida bot VI plugin # +# Copyright (C) diSabler <dsy@dsy.name> # +# # +# This program is free software: you can redistribute it and/or modify # +# it under the terms of the GNU General Public License as published by # +# the Free Software Foundation, either version 3 of the License, or # +# (at your option) any later version. # +# # +# This program is distributed in the hope that it will be useful, # +# but WITHOUT ANY WARRANTY; without even the implied warranty of # +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # +# GNU General Public License for more details. # +# # +# You should have received a copy of the GNU General Public License # +# along with this program. If not, see <http://www.gnu.org/licenses/>. # +# # +# --------------------------------------------------------------------------- # + +HTML_BODY = '''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> +<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + <link href="../../../.css/chatlog.css" rel="stylesheet" type="text/css" /> + <title>CHATNAME - DATE</title> + </head> + <body> + <div class="main"> + <div class="top"> + <div class="link"> + <a href="https://t.me/isida_bot" class="title-link" target="_blank">@isida_bot</a> + </div> + <div class="chat">CHATNAME - DATE</div> + </div> + <div class="container"> + BODY + </div> + </div> + </body> +</html>''' + +CONFIG_LOG = 'log' + +CHAT_ID = {} +LOGGER = True +LOG_FOLDER = DATA_FOLDER % 'chatlog/%s' + +try: + LOG_URL = CONFIG.get(CONFIG_LOG, 'url').strip(' /') +except: + LOG_URL = None +try: + LOG_DEBUG = get_config_bin(CONFIG, CONFIG_LOG, 'debug') +except: + LOG_DEBUG = False + +if not os.path.exists(LOG_FOLDER % ''): + os.mkdir(LOG_FOLDER % '') + +def cmd_log(raw_in, text): + if LOG_URL: + chat_id = raw_in['message'].get('chat', {}).get('id', '') + msg = 'Logs are <a href="%s/%s">here</a>!' % (LOG_URL, chat_id) + else: + msg = 'Logs not configured!' + send_msg(raw_in, msg, custom={'disable_web_page_preview': 'true'}) + +def logger_self(msg): + if LOG_DEBUG: + pprint(json.dumps(msg, indent=2, separators=(',', ': ')), 'green') + raw_in = {'message': {'chat': {'id': msg['chat_id']}}} + raw_in['message']['chat']['username'] = BOT_NAME + raw_in['message']['text'] = msg.get('text', '') + raw_in['message']['photo'] = msg.get('photo', '') + raw_in['message']['parse_mode'] = msg.get('parse_mode', '') + raw_in['message']['custom'] = msg.get('custom', {}) + logger(raw_in) + +def replace_items_regexp(t): + t = t.group().strip(' @') + return '<a href="https://t.me/%s" target="_blank">@%s</a>' % (t, t) + +def replace_items(text): + return re.sub('@[\w]+', replace_items_regexp, text) + +def logger(raw_in): + global CHAT_ID + if LOG_DEBUG: + pprint(json.dumps(raw_in, indent=2, separators=(',', ': ')), 'yellow') + if raw_in.has_key('callback_query'): + RAW_IN = {'message': raw_in['callback_query'].get('message', {})} + RAW_IN['message']['text'] = '📄 %s' % raw_in['callback_query'].get('data', 'unknown_cmd') + raw_in = RAW_IN + FOLDER = '%s' % raw_in['message'].get('chat', {}).get('id', None) + if FOLDER: + DATE = ['%02d' % t for t in time.localtime()[:3]] + FOLDER_RAW = '%s/%s/.template' % (FOLDER, '/'.join(DATE[:-1])) + if os.path.exists(LOG_FOLDER % FOLDER_RAW) and time.localtime(os.path.getctime(LOG_FOLDER % FOLDER_RAW))[2] != time.localtime()[2]: + os.remove(LOG_FOLDER % FOLDER_RAW) + FOLDER_HTML = '%s/%s.html' % (FOLDER, '/'.join(DATE)) + if not os.path.exists(LOG_FOLDER % FOLDER): + os.mkdir(LOG_FOLDER % FOLDER) + FOLDER += '/%s' % DATE[0] + if not os.path.exists(LOG_FOLDER % FOLDER): + os.mkdir(LOG_FOLDER % FOLDER) + FOLDER += '/%s' % DATE[1] + if not os.path.exists(LOG_FOLDER % FOLDER): + os.mkdir(LOG_FOLDER % FOLDER) + TYPE = raw_in['message'].get('chat', {}).get('type', '') + if TYPE in ['private', '']: + _TYPE = 'chat' + elif raw_in['message'].has_key('left_chat_participant'): + _TYPE = 'left_chat_participant' + elif raw_in['message'].has_key('new_chat_participant'): + _TYPE = 'new_chat_participant' + else: + _TYPE = 'from' + USERNAME = raw_in['message'].get(_TYPE, {}).get('username', '') + FIRSTNAME = raw_in['message'].get(_TYPE, {}).get('first_name', '') + LASTNAME = raw_in['message'].get(_TYPE, {}).get('last_name', '') + if USERNAME or FIRSTNAME or LASTNAME: + TIME = ':'.join('%02d' % t for t in time.localtime()[3:6]) + TIME = '<a id="%s" name="%s" href="#%s" class="time">%s</a>' % (TIME, TIME, TIME, TIME) + if USERNAME: + NAME = '<a href="https://t.me/%s" target="_blank" class="user">%s</a>' % (USERNAME, USERNAME) + if FIRSTNAME or LASTNAME: + NAME += ' </span><span class="name">%s' % ' '.join([FIRSTNAME, LASTNAME]) + else: + NAME = ' '.join([FIRSTNAME, LASTNAME]) + if _TYPE == 'left_chat_participant': + TEXT = 'leave chat' + data = '<span class="time">%s</span> <span class="user-leave">%s</span> <span class="text-leave">%s</span><br />\n' % (TIME, NAME, TEXT) + elif _TYPE == 'new_chat_participant': + TEXT = 'join chat' + data = '<span class="time">%s</span> <span class="user-join">%s</span> <span class="text-join">%s</span><br />\n' % (TIME, NAME, TEXT) + else: + TEXT = raw_in['message'].get('text', '').replace('\n', '<br />') + if not TEXT: + if raw_in['message'].has_key('sticker'): + TEXT = '%s [Sticker]' % raw_in['message'].get('sticker',{}).get('emoji', '?') + elif raw_in['message'].has_key('document'): + TEXT = '📄 [Document]' + else: + IMG = raw_in['message'].get('photo', '') + if IMG and type(IMG) == type(u''): + TEXT = '🖼<br /><img class="image" src="%s" alt="" />' % IMG + else: + TEXT = replace_items(TEXT) + data = '<span class="time">%s</span> <span class="user">%s</span> <span class="text">%s</span><br />\n' % (TIME, NAME, TEXT) + fp = file(LOG_FOLDER % FOLDER_RAW, 'a') + fp.write(data) + fp.close() + data_all = readfile(LOG_FOLDER % FOLDER_RAW) + chat_id = raw_in['message'].get('chat', {}).get('id', '') + if TYPE in ['supergroup', 'private']: + if TYPE == 'supergroup': + CHAT_TITLE = raw_in['message'].get('chat', {}).get('title', '') + else: + CHAT_TITLE = ' '.join([FIRSTNAME, LASTNAME]) + CHAT_NAME = raw_in['message'].get('chat', {}).get('username', '') + CHAT_ID[chat_id] = [CHAT_TITLE, CHAT_NAME] + CHAT_TITLE = CHAT_ID.get(chat_id,[''])[0] + CHAT_NAME = CHAT_ID.get(chat_id,['', ''])[1] + if CHAT_NAME: + CHAT_TITLE += ' - <a href="https://t.me/%s" class="title-link" target="_blank">@%s</a>' % (CHAT_NAME, CHAT_NAME) + HB = HTML_BODY.replace('CHATNAME', CHAT_TITLE) + _DATE = '<a href="../.." class="title-link">%s</a>/<a href=".." class="title-link">%s</a>/%s' % tuple(DATE) + HB = HB.replace('DATE', _DATE) + HB = HB.replace('BODY', data_all) + writefile(LOG_FOLDER % FOLDER_HTML, HB) + +commands = [['log', cmd_log, False, 'all', 'Show log info']] + +# The end is near! diff --git a/settings/config.ini.demo b/settings/config.ini.demo index 563bd4e..3937da0 100644 --- a/settings/config.ini.demo +++ b/settings/config.ini.demo @@ -16,3 +16,7 @@ id: 12345678 [lists]
test: black 1234567 2345678
botinfo: white 3456789 98765432
+
+[log]
+url: http://your-mega-site.com/logs
+debug: false
|