-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from TISUnion/MCDR
MCDR compatibility
- Loading branch information
Showing
13 changed files
with
881 additions
and
201 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,5 @@ | ||
seen.json | ||
.vscode/settings.json | ||
.idea | ||
|
||
*.mcdr |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
a plugin for MCDaemon | ||
a plugin for MCDR v2.0 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
mcd_seen.help_msg: | | ||
------ MCDR {3} v{4} ------ | ||
A plugin to query players online and offline time. | ||
§d【Command Help】§r | ||
§7{0}§r Show this message. | ||
§7{0}§r §e<player>§r Query player's on/offline time. | ||
§7{1}§r Show the rank of offline time | ||
§7{2}§r Show the rank of online time. | ||
§d【Additional Arguments】§r | ||
You can add more arguments when showing the ranks. | ||
The data will not include bot if no more arguments given. | ||
§e(Shadowing player will be proccessed as bot too.)§r | ||
§6There is following arguments available:§6 | ||
The argument in same color mustn't be given in 1 command. | ||
§6-all§r Show all the data. | ||
§6-merge§r Show all the data (merging bot and player data) | ||
§6-bot§r Show bot data only. | ||
§e-full§r Can only be used on offline rank, Show all the data instead of top 10, §ebut may show too much message sometimes. | ||
# Plain text | ||
mcd_seen.text.reg_help_msg: View laziness & hardworking rank | ||
mcd_seen.text.player: player | ||
mcd_seen.text.bot: bot | ||
mcd_seen.text.seen: have been offline for | ||
mcd_seen.text.player_liver: have been online for | ||
mcd_seen.text.bot_liver: have been online for | ||
mcd_seen.text.top_normal: §dplayer only§r | ||
mcd_seen.text.top_bot: §5bot only§r | ||
mcd_seen.text.top_merge: §7all players§r/§emerged§r | ||
mcd_seen.text.top_all: §7all players§r | ||
mcd_seen.text.reloaded: Plugin reloaded | ||
|
||
# Hover texts | ||
mcd_seen.hover.help_msg_suggest: "Click to fill {}" | ||
mcd_seen.hover.query_player: "Click to query player {}" | ||
mcd_seen.hover.show_help: "Click to show help" | ||
|
||
# Format texts | ||
mcd_seen.fmt.time_seen: "sec min hrs day" | ||
mcd_seen.fmt.seen_top: "Here are the {num} players §cofflined§r for the longest time({arg}):" | ||
mcd_seen.fmt.seen_top_full: "Here are all the players' offline time data({arg})" | ||
mcd_seen.fmt.liver_top: "Here are the players §acurrently online§r({arg}):" | ||
|
||
# Error texts | ||
mcd_seen.error.player_data_not_found: Player data not found! Click here for help | ||
mcd_seen.error.cmd_error: Command error! Click here for help |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
mcd_seen.help_msg: | | ||
§7-----§r MCDR {3} v{4} §7-----§r | ||
一个查看服务器玩家在线(爆肝)和下线(摸鱼)时间的插件 | ||
§d【指令说明】§r | ||
§7{0}§r 显示帮助信息 | ||
§7{0}§r §e<玩家>§r 查看玩家摸鱼/爆肝时长 | ||
§7{1}§r 查看摸鱼榜 | ||
§7{2}§r 查看爆肝榜 | ||
§d【额外参数说明】§r | ||
查看爆肝摸鱼榜时可添加额外参数 | ||
在不添加参数的情况下默认统计非假人玩家数据 | ||
(玩家shadow也算作假人处理) | ||
参数如下所示: | ||
同种颜色标注的参数不可叠加使用 | ||
§6-all§r 显示全部玩家统计数据(玩家同名假人会独立显示) | ||
§6-merge§r 显示全部玩家统计数据(玩家和同名假人会合并显示) | ||
§6-bot§r 仅显示假人的统计数据 | ||
§e-full§r 用于摸鱼榜,显示完整榜单(会刷屏, 慎用) | ||
# Plain text | ||
mcd_seen.text.reg_help_msg: 显示爆肝/摸鱼榜 | ||
mcd_seen.text.player: 玩家 | ||
mcd_seen.text.bot: 假人 | ||
mcd_seen.text.seen: 已经摸了 | ||
mcd_seen.text.player_liver: 已经肝了 | ||
mcd_seen.text.bot_liver: 已经被压榨了 | ||
mcd_seen.text.top_normal: §d仅真人玩家§r | ||
mcd_seen.text.top_bot: §5仅假人§r | ||
mcd_seen.text.top_merge: §7所有玩家§r/§e合并显示§r | ||
mcd_seen.text.top_all: §7所有玩家§r | ||
mcd_seen.text.reloaded: 插件已重载 | ||
|
||
# Hover texts | ||
mcd_seen.hover.help_msg_suggest: "点击以填入§7{}§r" | ||
mcd_seen.hover.query_player: "点击以查询玩家§e{}§r的数据" | ||
mcd_seen.hover.show_help: "点击以获取插件帮助信息" | ||
|
||
# Format texts | ||
mcd_seen.fmt.time_seen: "秒 分 小时 天" | ||
mcd_seen.fmt.seen_top: "摸鱼榜前§6{num}§r的§c鸽子§r({arg})如下: " | ||
mcd_seen.fmt.seen_top_full: "摸鱼榜全部§c鸽子§r({arg})如下: " | ||
mcd_seen.fmt.liver_top: "当前在线的§a肝帝§r({arg})如下: " | ||
|
||
# Error texts | ||
mcd_seen.error.player_data_not_found: 没有该玩家的数据 | ||
mcd_seen.error.cmd_error: 指令有误! 点此获取帮助信息 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
from parse import parse | ||
from mcdreforged.api.types import Info, PluginServerInterface | ||
from mcdreforged.api.decorator import new_thread | ||
|
||
from mcd_seen.utils import verify_player_name, bot_name, tr, logger, psi | ||
from mcd_seen.storage import storage, bot_list | ||
from mcd_seen.config import config | ||
from mcd_seen.interface import register_command | ||
|
||
|
||
def on_info(server: PluginServerInterface, info: Info) -> None: | ||
if info.is_from_server and config.identify_bot: | ||
logger.debug('Join event found with on_info') | ||
psd = parse('{name}[{ip}] logged in with entity id {id} at {loc}', info.content) | ||
if psd is not None and verify_player_name(psd['name']): | ||
player_name = bot_name(psd['name']) if psd['ip'] == 'local' else psd['name'] | ||
storage.player_joined(player_name) | ||
|
||
|
||
def on_player_joined(server: PluginServerInterface, player: str, info: Info = None): | ||
if not config.identify_bot: | ||
logger.debug('Join event found with on_player_joined') | ||
storage.player_joined(player) | ||
|
||
|
||
def on_player_left(server: PluginServerInterface, player: str): | ||
server.get_instance() # to satisfy pycharm >3 | ||
storage.player_left(player) | ||
|
||
|
||
def on_server_stop(*args, **kwargs): | ||
list(args).clear() # to satisfy pycharm >3 | ||
dict(kwargs).clear() | ||
storage.correct([]) | ||
|
||
|
||
def on_unload(*args, **kwargs): | ||
logger.unset_file() | ||
|
||
|
||
@new_thread(psi.get_self_metadata().name + '_PluginLoad') | ||
def warn_first_load(): | ||
logger.warning('Load Seen plugin when server is empty is suggested to make sure all the datas are right') | ||
|
||
|
||
def on_load(server: PluginServerInterface, prev_module): | ||
for prefix in config.seen_prefix: | ||
server.register_help_message(prefix, tr('mcd_seen.text.reg_help_msg')) | ||
register_command(server) | ||
if prev_module is not None: | ||
try: | ||
bot_list.clear() | ||
for player in prev_module.bot_list: | ||
bot_list.append(player) | ||
except AttributeError: | ||
logger.info('Seems upgraded from a old version, welcome!') | ||
else: | ||
if server.is_server_running(): | ||
warn_first_load() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
import json | ||
|
||
from typing import Union, List | ||
from mcdreforged.api.utils import Serializable | ||
from mcdreforged.api.types import ServerInterface | ||
|
||
from mcd_seen.constants import CONFIG_FILE | ||
|
||
|
||
psi = ServerInterface.get_instance().as_plugin_server_interface() | ||
|
||
|
||
class Config(Serializable): | ||
primary_prefix: Union[str, List[str]] = '!!seen' | ||
primary_rank_prefix: Union[str, List[str]] = '!!seen-top' | ||
secondary_rank_prefix: Union[str, List[str]] = '!!liver-top' | ||
seen_top_max: int = 10 | ||
player_prior_in_merge: bool = True | ||
log_seens: bool = True | ||
identify_bot: bool = True | ||
bot_list_delay: float = 0.3 | ||
verbosity: bool | ||
debug_commands: bool | ||
debug_prefixes: Union[str, List[str]] | ||
|
||
@staticmethod | ||
def get_iterable(original: Union[str, List[str]]) -> List[str]: | ||
if isinstance(original, str): | ||
return [original] | ||
return original | ||
|
||
@property | ||
def seen_prefix(self): | ||
return self.get_iterable(self.primary_prefix) | ||
|
||
@property | ||
def seen_top_prefix(self): | ||
return self.get_iterable(self.primary_rank_prefix) | ||
|
||
@property | ||
def liver_top_prefix(self): | ||
return self.get_iterable(self.secondary_rank_prefix) | ||
|
||
@property | ||
def debug_prefix(self): | ||
return self.get_iterable(self.serialize().get('debug_prefixes', '!!liver')) | ||
|
||
@property | ||
def prefixes(self): | ||
result = [] | ||
for item in [self.seen_prefix, self.seen_top_prefix, self.liver_top_prefix]: | ||
result += item | ||
return result | ||
|
||
@property | ||
def verbose_mode(self): | ||
return self.serialize().get('verbosity', False) | ||
|
||
@property | ||
def debug(self): | ||
return self.serialize().get('debug_commands', False) | ||
|
||
def save(self) -> None: | ||
with open(CONFIG_FILE, 'w', encoding='UTF-8') as f: | ||
json.dump(self.serialize(), f, indent=4, ensure_ascii=False) | ||
|
||
@classmethod | ||
def load(cls) -> 'Config': | ||
return psi.load_config_simple( | ||
CONFIG_FILE, | ||
default_config=cls.get_default().serialize(), | ||
in_data_folder=False, | ||
echo_in_console=True, | ||
target_class=cls | ||
) | ||
|
||
|
||
config = Config.load() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
import os | ||
|
||
|
||
def ensure(folder: str): | ||
if not os.path.isdir(folder): | ||
os.makedirs(folder) | ||
return folder | ||
|
||
|
||
# Seen file storage | ||
DATA_FOLDER = ensure('config/seen') | ||
CONFIG_FILE = os.path.join(DATA_FOLDER, 'config.json') | ||
SEENS_FILE = os.path.join(DATA_FOLDER, 'seen.json') | ||
LOG_FILE = os.path.join(DATA_FOLDER, 'logs', 'seen.log') | ||
SEENS_PATH_OLD = ['seen.json', 'config/seen.json'] | ||
OLD_LOG_FILE = os.path.join(DATA_FOLDER, 'player_seens.log') | ||
NEW_LOG_PATH = os.path.join(DATA_FOLDER, 'logs', 'old_seens.log') |
Oops, something went wrong.