Archived
1
0
Fork 0

🐛 修复漏洞

修复了不支持多行 MOTD 以及带色 MOTD 的问题
This commit is contained in:
SilianZ 2023-11-24 22:45:19 +08:00 committed by GitHub
parent fc156a344d
commit e15eacf4c2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1,105 +1,103 @@
import re import re
import traceback import traceback
import aiohttp import aiohttp
import ujson as json import ujson as json
from core.builtins import ErrorMessage from core.builtins import ErrorMessage
from core.logger import Logger from core.logger import Logger
async def server(msg, address, raw=False, showplayer=False, mode='j'): async def server(msg, address, raw=False, showplayer=False, mode='j'):
match_object = re.match(r'(.*)[\s:](.*)', address, re.M | re.I) match_object = re.match(r'(.*)[\s:](.*)', address, re.M | re.I)
servers = [] servers = []
n = '\n' n = '\n'
if match_object: if match_object:
serip = match_object.group(1) serip = match_object.group(1)
port1 = match_object.group(2) port1 = match_object.group(2)
port2 = match_object.group(2) port2 = match_object.group(2)
else: else:
serip = address serip = address
port1 = '25565' port1 = '25565'
port2 = '19132' port2 = '19132'
if mode == 'j': if mode == 'j':
try: try:
url = 'http://motd.wd-api.com/v1/java?host=' + serip + '&port=' + port1 url = 'http://motd.wd-api.com/v1/java?host=' + serip + '&port=' + port1
async with aiohttp.ClientSession() as session: async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=20)) as req: async with session.get(url, timeout=aiohttp.ClientTimeout(total=20)) as req:
if req.status != 200: if req.status != 200:
Logger.error(await req.text()) Logger.error(await req.text())
else: else:
jejson = json.loads(await req.text()) jejson = json.loads(await req.text())
try: try:
servers.append('[JE]') servers.append('[JE]')
if 'description' in jejson: if 'description' in jejson:
description = jejson['description'] description = jejson['description']
if 'text' in description: if 'text' in description and description['text'] != '':
servers.append(str(description['text'])) servers.append(str(description['text']))
elif 'extra' in description: if 'extra' in description and description['text'] != '':
extra = description['extra'] extra = description['extra']
text = [] text = []
for item in extra[:]: for item in extra[:]:
text.append(str(item['text'])) text.append(str(item['text']))
servers.append(''.join(text)) servers.append(''.join(text))
else:
servers.append(str(description)) if 'players' in jejson:
onlinesplayer = f"{msg.locale.t('server.message.player')}{str(jejson['players']['online'])} / {str(jejson['players']['max'])}"
if 'players' in jejson: servers.append(onlinesplayer)
onlinesplayer = f"{msg.locale.t('server.message.player')}{str(jejson['players']['online'])} / {str(jejson['players']['max'])}" if showplayer:
servers.append(onlinesplayer) playerlist = []
if showplayer: if 'sample' in jejson['players']:
playerlist = [] for x in jejson['players']['sample']:
if 'sample' in jejson['players']: playerlist.append(x['name'])
for x in jejson['players']['sample']: servers.append(
playerlist.append(x['name']) msg.locale.t('server.message.player.current') + '\n' + '\n'.join(
servers.append( playerlist))
msg.locale.t('server.message.player.current') + '\n' + '\n'.join( else:
playerlist)) if jejson['players']['online'] == 0:
else: servers.append(msg.locale.t('server.message.player.current.none'))
if jejson['players']['online'] == 0: if 'version' in jejson:
servers.append(msg.locale.t('server.message.player.current.none')) versions = msg.locale.t('server.message.version') + jejson['version']['name']
if 'version' in jejson: servers.append(versions)
versions = msg.locale.t('server.message.version') + jejson['version']['name'] servers.append(serip + ':' + port1)
servers.append(versions) except Exception:
servers.append(serip + ':' + port1) traceback.print_exc()
except Exception: servers.append(str(ErrorMessage(msg.locale.t('server.message.error'))))
traceback.print_exc() except Exception:
servers.append(str(ErrorMessage(msg.locale.t('server.message.error')))) traceback.print_exc()
except Exception: if raw:
traceback.print_exc() return n.join(servers)
if raw: return re.sub(r'§\w', "", n.join(servers))
return n.join(servers) if mode == 'b':
return re.sub(r'§\w', "", n.join(servers)) try:
if mode == 'b': beurl = 'http://motd.wd-api.com/v1/bedrock?host=' + serip + '&port=' + port2
try: async with aiohttp.ClientSession() as session2:
beurl = 'http://motd.wd-api.com/v1/bedrock?host=' + serip + '&port=' + port2 async with session2.get(beurl, timeout=aiohttp.ClientTimeout(total=20)) as req:
async with aiohttp.ClientSession() as session2: if req.status != 200:
async with session2.get(beurl, timeout=aiohttp.ClientTimeout(total=20)) as req: Logger.debug(await req.text())
if req.status != 200: else:
Logger.debug(await req.text()) bemotd = await req.text()
else: bejson = json.loads(bemotd)
bemotd = await req.text() unpack_data = bejson['data'].split(';')
bejson = json.loads(bemotd) edition = unpack_data[0]
unpack_data = bejson['data'].split(';') motd_1 = unpack_data[1]
edition = unpack_data[0] version_name = unpack_data[3]
motd_1 = unpack_data[1] player_count = unpack_data[4]
version_name = unpack_data[3] max_players = unpack_data[5]
player_count = unpack_data[4] motd_2 = unpack_data[7]
max_players = unpack_data[5] game_mode = unpack_data[8]
motd_2 = unpack_data[7] bemsg = '[BE]\n' + \
game_mode = unpack_data[8] motd_1 + ' - ' + motd_2 + \
bemsg = '[BE]\n' + \ '\n' + msg.locale.t('server.message.player') + player_count + '/' + max_players + \
motd_1 + ' - ' + motd_2 + \ '\n' + msg.locale.t('server.message.version') + edition + version_name + \
'\n' + msg.locale.t('server.message.player') + player_count + '/' + max_players + \ '\n' + msg.locale.t('server.message.gamemode') + game_mode
'\n' + msg.locale.t('server.message.version') + edition + version_name + \ servers.append(bemsg)
'\n' + msg.locale.t('server.message.gamemode') + game_mode servers.append(serip + ':' + port2)
servers.append(bemsg)
servers.append(serip + ':' + port2) except Exception:
traceback.print_exc()
except Exception: if raw:
traceback.print_exc() return n.join(servers)
if raw: return re.sub(r'§\w', "", n.join(servers))
return n.join(servers)
return re.sub(r'§\w', "", n.join(servers))