Archived
1
0
Fork 0
This repository has been archived on 2024-04-26. You can view files and clone it, but cannot push or open issues or pull requests.
akari-bot/modules/server/server.py

105 lines
4.9 KiB
Python
Raw Normal View History

2020-08-12 16:01:34 +00:00
import re
2021-01-08 12:30:59 +00:00
import traceback
2020-08-12 16:01:34 +00:00
2020-09-19 10:35:13 +00:00
import aiohttp
2021-09-10 18:05:27 +00:00
import ujson as json
2020-08-12 16:01:34 +00:00
2023-02-05 14:33:33 +00:00
from core.builtins import ErrorMessage
2022-08-15 05:29:37 +00:00
from core.logger import Logger
2021-12-31 15:08:23 +00:00
2021-02-01 15:13:11 +00:00
2023-03-23 15:25:46 +00:00
async def server(msg, address, raw=False, showplayer=False, mode='j'):
2022-10-22 15:03:00 +00:00
matchObj = re.match(r'(.*)[\s:](.*)', address, re.M | re.I)
2020-07-18 12:58:39 +00:00
servers = []
2021-06-23 14:51:38 +00:00
n = '\n'
2020-08-12 16:01:34 +00:00
2021-01-09 11:42:03 +00:00
if matchObj:
serip = matchObj.group(1)
port1 = matchObj.group(2)
2021-02-16 14:24:30 +00:00
port2 = matchObj.group(2)
else:
serip = address
2021-05-22 08:34:41 +00:00
port1 = '25565'
2021-02-16 14:24:30 +00:00
port2 = '19132'
2022-12-15 15:58:41 +00:00
2021-05-22 08:34:41 +00:00
if mode == 'j':
try:
2021-06-23 13:45:41 +00:00
url = 'http://motd.wd-api.com/v1/java?host=' + serip + '&port=' + port1
2021-05-22 08:34:41 +00:00
async with aiohttp.ClientSession() as session:
async with session.get(url, timeout=aiohttp.ClientTimeout(total=20)) as req:
if req.status != 200:
2023-06-03 16:09:31 +00:00
Logger.error(await req.text())
2021-05-22 08:34:41 +00:00
else:
2021-06-23 14:51:38 +00:00
jejson = json.loads(await req.text())
2021-05-22 08:34:41 +00:00
try:
2021-06-23 14:51:38 +00:00
servers.append('[JE]')
if 'description' in jejson:
description = jejson['description']
if 'text' in description:
servers.append(str(description['text']))
elif 'extra' in description:
extra = description['extra']
text = []
for item in extra[:]:
text.append(str(item['text']))
2023-04-12 08:25:47 +00:00
servers.append(''.join(text))
2021-06-23 14:51:38 +00:00
else:
servers.append(str(description))
2021-02-16 14:24:30 +00:00
2021-06-23 14:51:38 +00:00
if 'players' in jejson:
2023-03-15 13:18:14 +00:00
onlinesplayer = f"{msg.locale.t('server.message.player')}{str(jejson['players']['online'])} / {str(jejson['players']['max'])}"
2021-06-23 14:51:38 +00:00
servers.append(onlinesplayer)
if showplayer:
playerlist = []
2022-01-16 16:13:56 +00:00
if 'sample' in jejson['players']:
for x in jejson['players']['sample']:
playerlist.append(x['name'])
2023-04-30 03:30:59 +00:00
servers.append(
msg.locale.t('server.message.player.current') + '\n' + '\n'.join(playerlist))
2022-01-16 16:13:56 +00:00
else:
if jejson['players']['online'] == 0:
2023-03-15 13:02:08 +00:00
servers.append(msg.locale.t('server.message.player.current.none'))
2021-06-23 14:51:38 +00:00
if 'version' in jejson:
2023-03-15 13:02:08 +00:00
versions = msg.locale.t('server.message.version') + jejson['version']['name']
2021-06-23 14:51:38 +00:00
servers.append(versions)
servers.append(serip + ':' + port1)
2021-05-22 08:34:41 +00:00
except Exception:
traceback.print_exc()
2023-03-15 13:02:08 +00:00
servers.append(str(ErrorMessage(msg.locale.t('server.message.error'))))
2021-05-22 08:34:41 +00:00
except Exception:
traceback.print_exc()
if raw:
2021-06-23 14:51:38 +00:00
return n.join(servers)
return re.sub(r'§\w', "", n.join(servers))
2021-05-22 08:34:41 +00:00
if mode == 'b':
try:
2021-06-23 13:45:41 +00:00
beurl = 'http://motd.wd-api.com/v1/bedrock?host=' + serip + '&port=' + port2
2021-05-22 08:34:41 +00:00
async with aiohttp.ClientSession() as session2:
async with session2.get(beurl, timeout=aiohttp.ClientTimeout(total=20)) as req:
if req.status != 200:
2022-08-15 05:29:37 +00:00
Logger.debug(await req.text())
2021-05-22 08:34:41 +00:00
else:
bemotd = await req.text()
bejson = json.loads(bemotd)
2021-06-23 14:51:38 +00:00
unpack_data = bejson['data'].split(';')
2023-04-12 08:25:47 +00:00
edition = unpack_data[0]
2021-06-23 14:51:38 +00:00
motd_1 = unpack_data[1]
2023-04-12 08:25:47 +00:00
version_name = unpack_data[3]
2021-06-23 14:51:38 +00:00
player_count = unpack_data[4]
max_players = unpack_data[5]
2023-04-12 08:25:47 +00:00
motd_2 = unpack_data[7]
2021-06-23 14:51:38 +00:00
game_mode = unpack_data[8]
2021-05-22 08:34:41 +00:00
bemsg = '[BE]\n' + \
motd_1 + ' - ' + motd_2 + \
2023-03-15 13:02:08 +00:00
'\n' + msg.locale.t('server.message.player') + player_count + '/' + max_players + \
'\n' + msg.locale.t('server.message.version') + edition + version_name + \
'\n' + msg.locale.t('server.message.gamemode') + game_mode
2021-05-22 08:34:41 +00:00
servers.append(bemsg)
2021-07-04 10:19:47 +00:00
servers.append(serip + ':' + port2)
2021-01-08 12:30:59 +00:00
2021-05-22 08:34:41 +00:00
except Exception:
traceback.print_exc()
if raw:
2021-06-23 14:51:38 +00:00
return n.join(servers)
2023-03-23 15:25:46 +00:00
return re.sub(r'§\w', "", n.join(servers))