🐛 修复漏洞
修复了不支持多行 MOTD 以及带色 MOTD 的问题
This commit is contained in:
parent
fc156a344d
commit
e15eacf4c2
1 changed files with 103 additions and 105 deletions
|
@ -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))
|
|
||||||
|
|
Reference in a new issue