Files
NetworkDiffBot/src/utils.py
T
2020-11-27 09:32:10 -05:00

108 lines
3.0 KiB
Python

import difflib
import json
import textwrap
from urllib.parse import unquote
import requests
from pygments import highlight as syntax_highlight
from pygments.formatters.img import ImageFormatter
from pygments.lexers import *
from telegram.ext import CommandHandler
def toJson(obj):
return json.dumps(obj, default=lambda o: o.__dict__, sort_keys=True, indent=4)
# Wrap command
def createCommand(method):
# Create wrapper command
def command(update, context):
# Run command and get return data
data = method(update, context)
# Send back data if not null
if data is not None and data != '':
context.bot.send_message(chat_id=update.effective_chat.id, text=data, parse_mode="markdown")
# Create handler for the wrapper command
return CommandHandler(method.__name__, command, run_async=True)
# Create and execute http request
def create(req):
return requests.request(req['method'], req['url'], headers=req.get('headers', {}), data=req.get('payload', None))
# Convert json to more readable formats
def dictToString(obj, indent=4, indentLevel=1) -> str:
if type(obj) == dict:
if len(obj) == 0:
return '{}'
result = '{\n'
for (k, v) in obj.items():
result += ' ' * (indent * indentLevel) + k + ': '
# Dict inside dict
if type(v) == dict or type(v) == list:
if len(v) != 0:
result += '\n' + ' ' * (indent * indentLevel)
result += dictToString(v, indentLevel=indentLevel + 1) + '\n'
elif type(v) == str:
result += '"' + v.replace('\n', '\\n') + '"\n'
# Regular value
else:
result += str(v) + '\n'
return result + ' ' * (indent * (indentLevel - 1)) + '}'
# List
else:
if len(obj) == 0:
return '[]'
result = '[\n'
for v in obj:
result += ' ' * (indent * indentLevel)
# Dict inside list
if type(v) == dict:
result += dictToString(v, indentLevel=indentLevel + 1) + '\n'
elif type(v) == str:
result += '"' + v.replace('\n', '\\n') + '"\n'
else:
result += str(v) + '\n'
return result + ' ' * (indent * (indentLevel - 1)) + ']'
def render(message):
message = unquote(message)
lexer = get_lexer_by_name("diff", stripall=True)
# lexer = guess_lexer(message)
formatter = ImageFormatter(font_name="sarasa-mono-cl-regular", style="colorful", font_size=12, line_pad=4)
result = syntax_highlight(message, lexer, formatter, outfile=None)
return result
def wrap(string: str):
return '\n'.join(['\n '.join(textwrap.wrap(line, 120)) for line in string.splitlines()])
def sendRequest(req):
response = create(req)
text = response.text
if response.headers['Content-Type'] == 'application/json':
text = dictToString(json.loads(text))
response.close()
return text