package com.coloryr.allmusic.server.core.side; import com.coloryr.allmusic.codec.CommandType; import com.coloryr.allmusic.codec.HudPosObj; import com.coloryr.allmusic.codec.HudType; import com.coloryr.allmusic.server.core.AllMusic; import com.coloryr.allmusic.server.core.music.PlayMusic; import com.coloryr.allmusic.server.core.objs.music.PlayerAddMusicObj; import com.coloryr.allmusic.server.core.objs.music.SongInfoObj; import com.coloryr.allmusic.server.core.utils.HudUtils; import net.kyori.adventure.text.Component; import java.io.File; import java.util.Collection; import java.util.Locale; public abstract class BaseSide { /** * 主线程运行任务 * * @param run 任务 */ public abstract void runTask(Runnable run); /** * 主线程延迟任务 * * @param run 任务 * @param delay 延迟 */ public abstract void runTask(Runnable run, int delay); /** * 检查权限 * * @param player 用户 * @return 是否有权限 */ public abstract boolean checkPermission(Object player); /** * 是否为玩家执行指令 * * @param source 命令源 * @return 是否为玩家 */ public abstract boolean isPlayer(Object source); /** * 检查权限 * * @param player 用户 * @param permission 权限 * @return 是否有权限 */ public abstract boolean checkPermission(Object player, String permission); /** * 是否需要播放 * * @return 结果 */ public abstract boolean needPlay(boolean islist); /** * 获取所有玩家 * * @return 玩家列表 */ public abstract Collection getPlayers(); /** * 获取玩家名字 * * @param player 玩家 * @return 名字 */ public abstract String getPlayerName(Object player); /** * 获取玩家所在的服务器 * * @param player 玩家 * @return 名字 */ public abstract String getPlayerServer(Object player); /** * 向玩家发送数据包 * * @param player 玩家 * @param type 数据 * @param data 数据 * @param data1 数据 */ public abstract void send(Object player, CommandType type, String data, int data1); /** * 根据名字获取玩家 * * @param player 名字 * @return 玩家 */ public abstract Object getPlayer(String player); /** * 发送bar消息 * * @param player 玩家 * @param data 消息 */ public abstract void sendBar(Object player, Component data); /** * 获取插件配置文件夹 * * @return 文件夹 */ public abstract File getFolder(); /** * 发送消息 * * @param obj 接受对象 * @param message 消息 */ public abstract void sendMessage(Object obj, Component message); /** * 当歌曲添加时触发的事件 * * @param obj 歌曲信息 * @return 是否阻止播放 */ public abstract boolean onMusicPlay(SongInfoObj obj); /** * 当歌曲播放时触发的事件 * * @param obj 发送者 * @param music 歌曲信息 * @return 是否阻止添加 */ public abstract boolean onMusicAdd(Object obj, PlayerAddMusicObj music); /** * 广播消息 * * @param data 消息 */ public abstract void broadcast(Component data); /** * 重载 */ public final void reload() { AllMusic.init(getFolder()); } /** * 发送歌曲位置信息 * * @param player 用户名 * @param pos 歌曲位置(毫秒) */ public final void sendPos(String player, int pos) { Object player1 = getPlayer(player); if (player1 == null) return; if (AllMusic.isSkip(player, getPlayerServer(player), true)) return; try { send(player1, CommandType.POS, null, pos); } catch (Exception e) { AllMusic.log.data("[AllMusic]清空Hud发生出错"); e.printStackTrace(); } } /** * 发送停止指令 * * @param name 用户名 */ public final void sendStop(String name) { PlayMusic.removeNowPlayPlayer(name); Object player = getPlayer(name); if (player == null) return; try { send(player, CommandType.STOP, null, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]停止指令发送出错"); e.printStackTrace(); } } /** * 发送停止指令 */ public final void sendStop() { PlayMusic.clearNowPlayer(); try { for (Object player : getPlayers()) { send(player, CommandType.STOP, null, 0); } } catch (Exception e) { AllMusic.log.data("[AllMusic]停止指令发送出错"); e.printStackTrace(); } } /** * 向指定玩家发送播放歌曲指令 * * @param player 玩家 * @param url 地址 */ public final void sendMusic(String player, String url) { PlayMusic.addNowPlayPlayer(player); Object player1 = getPlayer(player); if (player1 == null) return; try { if (AllMusic.isSkip(player, getPlayerServer(player), false)) return; send(player1, CommandType.PLAY, url, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]歌曲指令发送出错"); e.printStackTrace(); } } /** * 发送Hud的歌词数据 * * @param data 数据 */ public final void sendHudLyric(String data) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); if (AllMusic.isSkip(name, getPlayerServer(player), true)) continue; try { HudPosObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; send(player, CommandType.LYRIC, data, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]歌词发送出错"); e.printStackTrace(); } } } /** * 发送Hud的信息数据 * * @param data 数据 */ public final void sendHudInfo(String data) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); if (AllMusic.isSkip(name, getPlayerServer(player), true)) continue; try { HudPosObj obj = HudUtils.get(name); if (!obj.lyric.enable) continue; send(player, CommandType.INFO, data, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]歌词信息发送出错"); e.printStackTrace(); } } } /** * 发送Hud的位置信息 * * @param name 用户名 */ public final void sendHudPos(String name) { Object player = getPlayer(name); if (player == null) return; if (AllMusic.isSkip(name, null, false)) return; try { HudPosObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); send(player, CommandType.HUD_DATA, data, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]界面位置发送出错"); e.printStackTrace(); } } /** * 发送Hud数据 * * @param name 用户名 * @param pos 位置 * @param data 信息 */ public final void sendHud(String name, HudType pos, String data) { try { if (pos == HudType.PIC) { return; } Object player = getPlayer(name); if (player == null) return; if (AllMusic.isSkip(name, getPlayerServer(player), true)) return; switch (pos) { case INFO: send(player, CommandType.INFO, data, 0); break; case LIST: send(player, CommandType.LIST, data, 0); break; case LYRIC: send(player, CommandType.LYRIC, data, 0); break; } } catch (Exception e) { AllMusic.log.data("[AllMusic]停止指令发送出错"); e.printStackTrace(); } } /** * 发送Hud的歌曲列表数据 * * @param data 数据 */ public final void sendHudList(String data) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); if (AllMusic.isSkip(name, getPlayerServer(player), true)) continue; try { HudPosObj obj = HudUtils.get(name); if (!obj.list.enable) continue; send(player, CommandType.LIST, data, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]歌曲列表发送出错"); e.printStackTrace(); } } } /** * 发送Hud位置数据 */ public final void sendHudUtilsAll() { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); try { HudPosObj obj = HudUtils.get(name); String data = AllMusic.gson.toJson(obj); send(player, CommandType.HUD_DATA, data, 0); } catch (Exception e1) { AllMusic.log.data("[AllMusic]数据发送发生错误"); e1.printStackTrace(); } } } /** * 发送Bar数据 * * @param data 数据 */ public final void sendBar(Component data) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); try { if (AllMusic.isSkip(name, getPlayerServer(player), true)) continue; sendBar(player, data); } catch (Exception e1) { AllMusic.log.data("[AllMusic]数据发送发生错误"); e1.printStackTrace(); } } } /** * 发送播放歌曲指令 * * @param url 歌曲Url */ public final void sendMusic(String url) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); if (AllMusic.isSkip(name, getPlayerServer(player), false)) continue; try { send(player, CommandType.PLAY, url, 0); PlayMusic.addNowPlayPlayer(name); } catch (Exception e) { AllMusic.log.data("[AllMusic]歌曲指令发送出错"); e.printStackTrace(); } } } /** * 发送图片数据指令 * * @param url 图片地址 */ public final void sendPic(String url) { for (Object player : getPlayers()) { String name = getPlayerName(player); if (name == null) continue; name = name.toLowerCase(Locale.ROOT); if (AllMusic.isSkip(name, getPlayerServer(player), true)) continue; HudPosObj obj = HudUtils.get(name); if (!obj.pic.enable) continue; try { send(player, CommandType.IMG, url, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]图片指令发送出错"); e.printStackTrace(); } } } /** * 发送图片数据指令 * * @param player 用户名 * @param url 图片地址 */ public final void sendPic(String player, String url) { Object player1 = getPlayer(player); if (player1 == null) return; if (AllMusic.isSkip(player, getPlayerServer(player), true)) return; try { send(player1, CommandType.IMG, url, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]图片指令发送出错"); e.printStackTrace(); } } /** * 清理Hud数据 * * @param name 用户名 */ public final void clearHud(String name) { Object player = getPlayer(name); if (player == null) return; try { send(player, CommandType.CLEAR, null, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]清空Hud发生出错"); e.printStackTrace(); } } /** * 清理Hud数据 */ public final void clearHud() { for (Object player : getPlayers()) { try { send(player, CommandType.CLEAR, null, 0); } catch (Exception e) { AllMusic.log.data("[AllMusic]清空Hud发生出错"); e.printStackTrace(); } } } /** * 在主线程中广播消息 * * @param data 消息 */ public final void broadcastInTask(Component data) { runTask(() -> broadcast(data)); } /** * 在主线程中广播消息 * * @param data 消息 */ public final void broadcastInTask(String data) { broadcastInTask(AllMusic.miniMessage(data)); } /** * 在主线程发送消息 * * @param obj 接受对象 * @param message 消息 */ public final void sendMessageTask(Object obj, String message) { runTask(() -> sendMessage(obj, AllMusic.miniMessage(message))); } /** * 广播消息 * * @param data 消息 */ public final void broadcast(String data) { broadcast(AllMusic.miniMessage(data)); } /** * 发送消息 * * @param obj 接受对象 * @param message 消息 */ public final void sendMessage(Object obj, String message) { sendMessage(obj, AllMusic.miniMessage(message)); } /** * 更新信息 */ public void updateInfo() { } /** * 更新歌词 */ public void updateLyric() { } /** * BC发送ping包 */ public void ping() { } /*** * 在主线程中广播 * @param data 数据 */ public void sendBarInTask(Component data) { runTask(() -> sendBar(data)); } /*** * 在主线程中广播 * @param data 数据 */ public void sendBarInTask(String data) { sendBarInTask(AllMusic.miniMessage(data)); } }