fix things, add jsondump command
This commit is contained in:
parent
b989aaeea2
commit
ebd352cf80
|
@ -63,7 +63,7 @@ class Bot:
|
||||||
|
|
||||||
text = message_text[len(command_text) + 1:].strip()
|
text = message_text[len(command_text) + 1:].strip()
|
||||||
try:
|
try:
|
||||||
args, text = self.parse_args(text, cmd.args)
|
args, text = parse_args(text, cmd.args)
|
||||||
except ValueError as e:
|
except ValueError as e:
|
||||||
await event.respond(f'Error: {e}')
|
await event.respond(f'Error: {e}')
|
||||||
return
|
return
|
||||||
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
import time
|
||||||
|
import json
|
||||||
|
from .. import bot
|
||||||
|
from ..internal.command_context import CommandContext
|
||||||
|
from ..internal.arg_parser import Arg, ArgType
|
||||||
|
from ..utils.paste import paste as paste_util
|
||||||
|
|
||||||
|
@bot.command(
|
||||||
|
'jsondump',
|
||||||
|
aliases=['json', 'dump', 'jd'],
|
||||||
|
description='Dump the sent message or the replied to message as JSON',
|
||||||
|
args=[
|
||||||
|
Arg('paste', type=ArgType.bool, aliases=['p'], default=False, description='Whether to paste the JSON (will paste anyway if the JSON is too long)'),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
async def jsondump(bot, ctx: CommandContext):
|
||||||
|
# Get the message to paste
|
||||||
|
message = ctx.reply_to or ctx.message
|
||||||
|
dict = message.to_dict()
|
||||||
|
|
||||||
|
# Prettify the JSON
|
||||||
|
raw = json.dumps(dict, indent=4, sort_keys=True, default=str)
|
||||||
|
|
||||||
|
# Check if the JSON is too long
|
||||||
|
if len(raw) > 4000 or ctx.args['paste']:
|
||||||
|
# Paste the JSON
|
||||||
|
url = paste_util(raw, 'json')['url']
|
||||||
|
await ctx.event.respond(f'Created paste: {url}', link_preview=False)
|
||||||
|
else:
|
||||||
|
# Respond with the JSON
|
||||||
|
await ctx.event.respond(f'```\n{raw}\n```', link_preview=False)
|
|
@ -5,6 +5,7 @@ from telethon.tl.custom.message import Message
|
||||||
from .. import bot
|
from .. import bot
|
||||||
from ..internal.command_context import CommandContext
|
from ..internal.command_context import CommandContext
|
||||||
from ..internal.arg_parser import Arg, ArgType
|
from ..internal.arg_parser import Arg, ArgType
|
||||||
|
from ..utils.paste import paste as paste_util
|
||||||
|
|
||||||
ENDPOINT = 'https://0x45.st/api/pastes'
|
ENDPOINT = 'https://0x45.st/api/pastes'
|
||||||
|
|
||||||
|
@ -44,18 +45,7 @@ async def paste(bot, ctx: CommandContext):
|
||||||
if not contents:
|
if not contents:
|
||||||
contents = text
|
contents = text
|
||||||
|
|
||||||
data = {
|
json = paste_util(contents, language)
|
||||||
'language': language,
|
|
||||||
'contents': contents,
|
|
||||||
}
|
|
||||||
|
|
||||||
response = httpx.post(ENDPOINT, json=data)
|
|
||||||
if response.status_code > 299:
|
|
||||||
await ctx.event.respond(f'Failed to create paste: {response.text}')
|
|
||||||
return
|
|
||||||
|
|
||||||
# Get the paste URL
|
|
||||||
json = response.json()
|
|
||||||
url = json['url']
|
url = json['url']
|
||||||
|
|
||||||
# Respond with the paste URL
|
# Respond with the paste URL
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
|
import logging
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from typing import Dict, List, Union
|
from typing import Dict, List, Union
|
||||||
|
|
||||||
|
|
||||||
ArgType = Enum('ArgType', ['str', 'int', 'bool', 'peer_id'])
|
ArgType = Enum('ArgType', ['str', 'int', 'bool', 'peer_id'])
|
||||||
|
|
||||||
|
logger = logging.getLogger('cyber_fenneko.internal.arg_parser')
|
||||||
|
|
||||||
class Arg:
|
class Arg:
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
|
@ -35,7 +38,7 @@ class Arg:
|
||||||
self.description = description
|
self.description = description
|
||||||
self.global_arg = global_arg
|
self.global_arg = global_arg
|
||||||
|
|
||||||
def parse_args(self, text: str, cmd_args: List[Arg]) -> (Dict[str, Arg], str):
|
def parse_args(text: str, cmd_args: List[Arg]) -> (Dict[str, Arg], str):
|
||||||
"""
|
"""
|
||||||
Take an incoming string and parse args from it.
|
Take an incoming string and parse args from it.
|
||||||
Args are defined one of three ways:
|
Args are defined one of three ways:
|
||||||
|
@ -64,7 +67,7 @@ def parse_args(self, text: str, cmd_args: List[Arg]) -> (Dict[str, Arg], str):
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'Arg "{arg.name}" is not a boolean, but a boolean was provided')
|
raise ValueError(f'Arg "{arg.name}" is not a boolean, but a boolean was provided')
|
||||||
else:
|
else:
|
||||||
self.logger.warning(f'Unknown arg "{arg.name}"')
|
logger.warning(f'Unknown arg "{arg.name}"')
|
||||||
continue
|
continue
|
||||||
elif token.startswith('!'):
|
elif token.startswith('!'):
|
||||||
# shorthand for name:false
|
# shorthand for name:false
|
||||||
|
@ -75,7 +78,7 @@ def parse_args(self, text: str, cmd_args: List[Arg]) -> (Dict[str, Arg], str):
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'Arg "{arg.name}" is not a boolean, but a boolean was provided')
|
raise ValueError(f'Arg "{arg.name}" is not a boolean, but a boolean was provided')
|
||||||
else:
|
else:
|
||||||
self.logger.warning(f'Unknown arg "{arg.name}"')
|
logger.warning(f'Unknown arg "{arg.name}"')
|
||||||
continue
|
continue
|
||||||
elif ':' in token:
|
elif ':' in token:
|
||||||
# name:value
|
# name:value
|
||||||
|
@ -110,7 +113,7 @@ def parse_args(self, text: str, cmd_args: List[Arg]) -> (Dict[str, Arg], str):
|
||||||
else:
|
else:
|
||||||
raise ValueError(f'Invalid arg type {arg.type} for arg "{arg.name}"')
|
raise ValueError(f'Invalid arg type {arg.type} for arg "{arg.name}"')
|
||||||
else:
|
else:
|
||||||
self.logger.warning(f'Unknown arg "{arg.name}"')
|
logger.warning(f'Unknown arg "{arg.name}"')
|
||||||
continue
|
continue
|
||||||
|
|
||||||
# If we get here, we've encountered a non-arg token
|
# If we get here, we've encountered a non-arg token
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
from typing import Dict
|
from typing import Dict, Union
|
||||||
from telethon import TelegramClient
|
from telethon import TelegramClient
|
||||||
from telethon.events import NewMessage
|
from telethon.events import NewMessage
|
||||||
from telethon.tl.custom.message import Message
|
from telethon.tl.custom.message import Message
|
||||||
|
@ -30,7 +30,7 @@ class CommandContext:
|
||||||
message: Message,
|
message: Message,
|
||||||
|
|
||||||
# The message that was replied to
|
# The message that was replied to
|
||||||
reply_to: Message,
|
reply_to: Union[Message, None],
|
||||||
|
|
||||||
# The arguments that were passed to the command
|
# The arguments that were passed to the command
|
||||||
args: Dict[str, Arg]
|
args: Dict[str, Arg]
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
import httpx
|
||||||
|
|
||||||
|
|
||||||
|
ENDPOINT = 'https://0x45.st/api/pastes'
|
||||||
|
|
||||||
|
def paste(text: str, language: str = 'txt', password = None, burn = False) -> str:
|
||||||
|
data = {
|
||||||
|
'language': language,
|
||||||
|
'contents': text,
|
||||||
|
'password': password,
|
||||||
|
'burnAfterReading': burn,
|
||||||
|
}
|
||||||
|
|
||||||
|
response = httpx.post(ENDPOINT, json=data)
|
||||||
|
if response.status_code > 299:
|
||||||
|
raise Exception(f'Failed to create paste: {response.text}')
|
||||||
|
|
||||||
|
json = response.json()
|
||||||
|
return json
|
Loading…
Reference in New Issue