Skip to content

Commit

Permalink
Merge pull request #1 from TISUnion/MCDR
Browse files Browse the repository at this point in the history
MCDR compatibility
  • Loading branch information
Ra1ny-Yuki authored Feb 27, 2024
2 parents d2e39b1 + 5a58309 commit 97aa06e
Show file tree
Hide file tree
Showing 13 changed files with 881 additions and 201 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
seen.json
.vscode/settings.json
.idea

*.mcdr
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1 +1 @@
a plugin for MCDaemon
a plugin for MCDR v2.0
46 changes: 46 additions & 0 deletions lang/en_us.yml
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
46 changes: 46 additions & 0 deletions lang/zh_cn.yml
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: 指令有误! 点此获取帮助信息
59 changes: 59 additions & 0 deletions mcd_seen/__init__.py
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()
78 changes: 78 additions & 0 deletions mcd_seen/config.py
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()
17 changes: 17 additions & 0 deletions mcd_seen/constants.py
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')
Loading

0 comments on commit 97aa06e

Please sign in to comment.