Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/isida/vi.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordiSabler <dissy@ya.ru>2017-07-30 19:09:13 +0300
committerdiSabler <dissy@ya.ru>2017-07-30 19:09:13 +0300
commita0a67e85a2027c2fe76ee6bcab7c708fb0de3a3c (patch)
tree366e6522a5f14718aaed67cb222b803238ac2b41
parentc2798fb8dd5b694d71a366f8a2246d4bef0c8fcf (diff)
add: chatlogs!
fix: drink plugin upd: error plugin
-rw-r--r--.gitignore3
-rw-r--r--data/chatlog/.css/chatlog.css121
-rw-r--r--kernel.py8
-rw-r--r--plugins/drink.py22
-rw-r--r--plugins/error.py2
-rw-r--r--plugins/logger.py178
-rw-r--r--settings/config.ini.demo4
7 files changed, 324 insertions, 14 deletions
diff --git a/.gitignore b/.gitignore
index 919ceef..e6545b9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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;
+}
diff --git a/kernel.py b/kernel.py
index 06403cf..d51e7ce 100644
--- a/kernel.py
+++ b/kernel.py
@@ -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