投票序列

This commit is contained in:
Color_yr committed 2026-08-28 20:55:43 +08:00
1 parent 45d1d13c64
commit 126a32ab60
18 files changed
+409 -313

No files matched your search

+1 -1
View File
@@ -12,7 +12,7 @@ allprojects {
apply(plugin = "com.gradleup.shadow")
group = "com.coloryr"
version = "4.1.9"
version = "4.2.0"
// 设置项目JDK版本
java.sourceCompatibility = JavaVersion.VERSION_1_8
@@ -55,11 +55,11 @@ public class AllMusic {
/**
* 配置文件版本号
*/
public static final String configVersion = "401";
public static final String configVersion = "402";
/**
* 语言文件配置版本号
*/
public static final String messageVersion = "400";
public static final String messageVersion = "401";
/**
* 日志
*/
@@ -44,6 +44,7 @@ public class CommandEX {
commandList.put("push", new CommandPush());
commandList.put("join", new CommandJoin());
commandList.put("cancel", new CommandCancel());
commandList.put("agree", new CommandAgree());
commandAdminList.put("reload", new CommandReload());
commandAdminList.put("next", new CommandNext());
@@ -197,7 +198,7 @@ public class CommandEX {
musicID = api1.getMusicId(arg);
if (api1.checkId(musicID)) {
if (PlayMusic.getListSize() >= AllMusic.getConfig().maxPlayList) {
if (PlayMusic.getListSize() >= AllMusic.getConfig().limit.maxPlayerList) {
AllMusic.side.sendMessageTask(sender, AllMusic.getMessage().addMusic.listFull);
} else if (BanSave.checkBanMusic(musicID, api)) {
AllMusic.side.sendMessageTask(sender, AllMusic.getMessage().addMusic.banMusic);
@@ -0,0 +1,40 @@
package com.coloryr.allmusic.server.core.command.sub;
import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.command.ACommand;
import com.coloryr.allmusic.server.core.command.PermissionList;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.coloryr.allmusic.server.core.music.PlayRuntime;
import com.coloryr.allmusic.server.core.music.VoteItem;
import com.coloryr.allmusic.server.core.objs.message.ARG;
public class CommandAgree extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
if (AllMusic.getConfig().needPermission &&
!AllMusic.side.checkPermission(sender, PermissionList.PERMISSION_VOTE)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.noPermission);
return;
}
VoteItem vote = PlayMusic.getVote();
if (vote == null) {
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.err4);
return;
}
if (vote.votePlayer.contains(name)) {
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.err5);
return;
}
AllMusic.side.sendMessage(name, AllMusic.getMessage().vote.agree);
String data = AllMusic.getMessage().vote.bqAgree;
data = data.replace(ARG.player, name)
.replace(ARG.count, String.valueOf(vote.votePlayer.size()))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
PlayMusic.addVote(name);
}
}
@@ -50,10 +50,10 @@ public class CommandBan extends ACommand {
if (args.length == index || (args.length == index + 1)) {
List<String> list = new ArrayList<>();
if (PlayMusic.nowPlayMusic != null) {
list.add(PlayMusic.nowPlayMusic.getID());
list.add(PlayMusic.nowPlayMusic.getId());
}
for (SongInfoObj item : PlayMusic.getList()) {
list.add(item.getID());
list.add(item.getId());
}
return list;
@@ -24,6 +24,8 @@ public class CommandHelp extends ACommand {
.append(AllMusic.side.miniMessageSuggest(AllMusic.getMessage().click.clickRun, "/music push ")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.push1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music push cancel")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.vote)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music vote")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.mute)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().click.clickRun, "/music mute")));
AllMusic.side.sendMessage(sender, AllMusic.side.miniMessage(AllMusic.getMessage().help.normal.mutelist)
@@ -4,7 +4,7 @@ import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.command.ACommand;
import com.coloryr.allmusic.server.core.command.PermissionList;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.coloryr.allmusic.server.core.music.PlayRuntime;
import com.coloryr.allmusic.server.core.music.VoteItem;
import com.coloryr.allmusic.server.core.objs.message.ARG;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import com.coloryr.allmusic.server.core.saves.BanSave;
@@ -32,22 +32,27 @@ public class CommandPush extends ACommand {
return;
}
SongInfoObj id1 = PlayMusic.findMusicIndex(1);
if (id1 != null && id1.getID().equalsIgnoreCase(music.getID())) {
if (id1 != null && id1.getId().equalsIgnoreCase(music.getId())) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.pushErr);
return;
}
VoteItem item = new VoteItem(music.getApi(), music.getId(), name, VoteItem.VoteType.PUSH);
if (PlayMusic.startVote(item)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err3);
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("cancel")) {
if (!name.equalsIgnoreCase(PlayMusic.getPushSender())) {
if (!PlayMusic.haveVote(name, VoteItem.VoteType.PUSH)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err1);
return;
}
if (PlayMusic.getPushTime() <= 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err2);
return;
}
PlayMusic.clearPush();
AllMusic.side.broadcast(AllMusic.getMessage().push.cancel);
PlayMusic.removeVote(name, VoteItem.VoteType.PUSH);
AllMusic.side.sendMessage(name, AllMusic.getMessage().push.cancel1);
return;
} else {
try {
@@ -61,43 +66,20 @@ public class CommandPush extends ACommand {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.noId1.replace(ARG.index, args[1]));
return;
}
VoteItem item = new VoteItem(music.getApi(), music.getId(), name, VoteItem.VoteType.PUSH);
if (PlayMusic.startVote(item)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err3);
}
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
}
} else if (args.length > 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
}
if (PlayMusic.getPushTime() <= 0) {
if (music == null) {
return;
}
PlayMusic.startPush(name, music);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.doVote);
String data = AllMusic.getMessage().push.bq;
data = data.replace(ARG.player, name)
.replace(ARG.time, String.valueOf(AllMusic.getConfig().voteTime))
.replace(ARG.musicName, music.getName())
.replace(ARG.musicAuthor, music.getAuthor())
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().push.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().push.bq2, "/music push")));
} else {
if (music != null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.err3);
return;
}
if (!PlayMusic.containPush(name)) {
PlayMusic.addPush(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.agree);
String data = AllMusic.getMessage().push.bqAgree;
data = data.replace(ARG.player, name)
.replace(ARG.count, String.valueOf(PlayMusic.getVoteCount()))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().push.arAgree);
}
}
BanSave.removeMutePlayer(name);
}
@@ -4,10 +4,11 @@ import com.coloryr.allmusic.server.core.AllMusic;
import com.coloryr.allmusic.server.core.command.ACommand;
import com.coloryr.allmusic.server.core.command.PermissionList;
import com.coloryr.allmusic.server.core.music.PlayMusic;
import com.coloryr.allmusic.server.core.music.PlayRuntime;
import com.coloryr.allmusic.server.core.objs.message.ARG;
import com.coloryr.allmusic.server.core.music.VoteItem;
import com.coloryr.allmusic.server.core.saves.BanSave;
import java.util.Locale;
public class CommandVote extends ACommand {
@Override
public void execute(Object sender, String name, String[] args) {
@@ -21,15 +22,17 @@ public class CommandVote extends ACommand {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().musicPlay.emptyPlayingMusic);
} else if (args.length == 2) {
if (args[1].equalsIgnoreCase("cancel")) {
if (!name.equalsIgnoreCase(PlayMusic.getVoteSender())) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err1);
return;
} else if (PlayMusic.getVoteTime() <= 0) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err2);
VoteItem vote = PlayMusic.getVote();
if (vote == null) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err4);
return;
}
AllMusic.side.broadcast(AllMusic.getMessage().vote.cancel);
PlayMusic.clearVote();
if (!PlayMusic.haveVote(name, VoteItem.VoteType.NEXT)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err1);
return;
}
PlayMusic.removeVote(name, VoteItem.VoteType.NEXT);
AllMusic.side.sendMessage(name, AllMusic.getMessage().push.cancel1);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
}
@@ -37,27 +40,15 @@ public class CommandVote extends ACommand {
} else if (args.length > 2) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().command.error);
return;
} else if (PlayMusic.getVoteTime() <= 0) {
PlayMusic.startVote(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.doVote);
String data = AllMusic.getMessage().vote.bq;
data = data.replace(ARG.player, name)
.replace(ARG.time, String.valueOf(AllMusic.getConfig().voteTime))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().vote.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().vote.bq2, "/music vote")));
} else {
if (!PlayMusic.containVote(name)) {
PlayMusic.addVote(name);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.agree);
String data = AllMusic.getMessage().vote.bqAgree;
data = data.replace(ARG.player, name)
.replace(ARG.count, String.valueOf(PlayMusic.getVoteCount()))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
String player = name.toLowerCase(Locale.ROOT);
VoteItem item = new VoteItem(PlayMusic.nowPlayMusic.getApi(), PlayMusic.nowPlayMusic.getId(), player, VoteItem.VoteType.NEXT);
item.votePlayer.add(player);
if (PlayMusic.startVote(item)) {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.doVote);
} else {
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.arAgree);
AllMusic.side.sendMessage(sender, AllMusic.getMessage().vote.err3);
}
}
BanSave.removeMutePlayer(name);
@@ -26,13 +26,14 @@ public class PlayMusic {
*/
private static final Set<String> nowPlayPlayer = new HashSet<>();
/**
* 切歌投票的玩家
* 投票序列
*/
private static final Set<String> votePlayer = new HashSet<>();
private static final Queue<VoteItem> voteList = new ConcurrentLinkedQueue<>();
/**
* 插歌投票的玩家
* 当前投票
*/
private static final Set<String> pushPlayer = new HashSet<>();
private static VoteItem vote;
/**
* 总歌曲长度
*/
@@ -65,22 +66,6 @@ public class PlayMusic {
* 切歌投票时间
*/
private static int voteTime = 0;
/**
* 切歌发起人
*/
private static String voteSender;
/**
* 插歌投票时间
*/
private static int pushTime = 0;
/**
* 插歌发起人
*/
private static String pushSender;
/**
* 插歌目标
*/
private static SongInfoObj push;
/**
* 空闲列表取出的歌曲序号
*/
@@ -93,115 +78,140 @@ public class PlayMusic {
new Thread(PlayMusic::task, "allmusic_task").start();
}
public static boolean haveVote(String name, VoteItem.VoteType voteType) {
name = name.toLowerCase(Locale.ROOT);
for (VoteItem item : voteList) {
if (item.getType() == voteType && item.getVoteSender().equalsIgnoreCase(name)) {
return true;
}
}
return false;
}
/**
* 添加投票的玩家
* 通过投票
*
* @param player 用户名
*/
public static void addVote(String player) {
player = player.toLowerCase();
votePlayer.add(player);
}
player = player.toLowerCase(Locale.ROOT);
if (vote == null) {
return;
}
public static void startVote(String player) {
player = player.toLowerCase();
voteSender = player;
votePlayer.add(player);
voteTime = AllMusic.getConfig().voteTime;
vote.votePlayer.add(player);
}
/**
* 添加投票的玩家
* 发起投票
*
* @param player 用户名
* @param vote 投票内容
*/
public static void addPush(String player) {
player = player.toLowerCase();
pushPlayer.add(player);
public static boolean startVote(VoteItem vote) {
String id = vote.getId();
String api = vote.getApi();
for (VoteItem item : voteList) {
if (item.getId().equalsIgnoreCase(id) && item.getApi().equalsIgnoreCase(api)) {
return false;
}
}
voteList.add(vote);
voteTime = AllMusic.getConfig().vote.voteTime;
return true;
}
public static void startPush(String player, SongInfoObj music) {
player = player.toLowerCase();
push = music;
pushSender = player;
pushPlayer.add(player);
pushTime = AllMusic.getConfig().voteTime;
public static SongInfoObj getMusic(String id, String api) {
for (SongInfoObj item : playList) {
if (item.getId().equalsIgnoreCase(id) && item.getApi().equalsIgnoreCase(api)) {
return item;
}
}
return null;
}
public static void pushTick() {
pushTime--;
public static void doVote() {
if (vote == null) {
return;
}
if (vote.getType() == VoteItem.VoteType.NEXT) {
if (nowPlayMusic != null && nowPlayMusic.getApi()
.equalsIgnoreCase(vote.getApi()) && nowPlayMusic.getId().equalsIgnoreCase(vote.getId())) {
musicLessTime = 0;
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.next);
}
} else {
SongInfoObj obj = getMusic(vote.getId(), vote.getApi());
if (obj != null) {
synchronized (playList) {
playList.remove(obj);
playList.add(0, obj);
}
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.doPush);
}
}
vote = null;
}
public static void voteTick() {
voteTime--;
}
public static SongInfoObj getPush() {
return push;
}
public static int getPushTime() {
return pushTime;
}
public static String getPushSender() {
return pushSender;
}
public static int getVoteTime() {
return voteTime;
}
public static String getVoteSender() {
return voteSender;
public static VoteItem getVote() {
return vote;
}
/**
* 获取投票数量
*
* @return 数量
*/
public static int getVoteCount() {
return votePlayer.size();
return voteList.size();
}
public static int getPushCount() {
return pushPlayer.size();
public static void removeVote(String name, VoteItem.VoteType voteType) {
if (vote != null) {
if (vote.getVoteSender().equalsIgnoreCase(name) && vote.getType() == voteType) {
removeVote();
if (voteType == VoteItem.VoteType.NEXT) {
AllMusic.side.broadcast(AllMusic.getMessage().push.cancel);
}
else {
AllMusic.side.broadcast(AllMusic.getMessage().vote.cancel);
}
return;
}
}
VoteItem item1 = null;
for (VoteItem item : voteList) {
if (item.getType() == voteType && item.getVoteSender().equalsIgnoreCase(name)) {
item1 = item;
break;
}
}
if (item1 != null) {
voteList.remove(item1);
}
}
public static void removeVote() {
vote = null;
}
/**
* 清空投票
* 下一个投票
* @return 投票
*/
public static void clearVote() {
voteTime = -1;
voteSender = null;
votePlayer.clear();
}
/**
* 清空插歌
*/
public static void clearPush() {
pushTime = -1;
push = null;
pushSender = null;
pushPlayer.clear();
}
/**
* 是否已经投票了
*
* @param player 用户名
* @return 结果
*/
public static boolean containVote(String player) {
player = player.toLowerCase();
return votePlayer.contains(player);
}
public static boolean containPush(String player) {
player = player.toLowerCase();
return pushPlayer.contains(player);
public static VoteItem nextVote() {
vote = voteList.poll();
return vote;
}
/**
@@ -231,11 +241,8 @@ public class PlayMusic {
}
}
nowPlayPlayer.clear();
votePlayer.clear();
pushPlayer.clear();
playList.clear();
clearVote();
clearPush();
voteList.clear();
AllMusic.log.data("歌曲处理线程关闭");
}
@@ -310,17 +317,6 @@ public class PlayMusic {
}
}
/**
* 将歌曲移动到队列头
*/
public static void pushMusic() {
SongInfoObj obj = push;
synchronized (playList) {
playList.remove(obj);
playList.add(0, obj);
}
}
/**
* 获取播放列表长度
*
@@ -420,11 +416,11 @@ public class PlayMusic {
* @return 是否在列表种
*/
public static boolean haveMusic(String id, String api) {
if (nowPlayMusic != null && nowPlayMusic.getID().equalsIgnoreCase(id)
if (nowPlayMusic != null && nowPlayMusic.getId().equalsIgnoreCase(id)
&& Objects.equals(nowPlayMusic.getApi(), api))
return true;
for (SongInfoObj item : playList) {
if (item.getID().equalsIgnoreCase(id) && Objects.equals(item.getApi(), api)) {
if (item.getId().equalsIgnoreCase(id) && Objects.equals(item.getApi(), api)) {
return true;
}
}
@@ -438,7 +434,7 @@ public class PlayMusic {
* @return 是否超过上限
*/
public static boolean isPlayerMax(String name) {
int list = AllMusic.getConfig().maxPlayerList;
int list = AllMusic.getConfig().limit.maxPlayerList;
if (list == 0) {
return false;
}
@@ -7,7 +7,6 @@ import com.coloryr.allmusic.server.core.objs.music.MusicObj;
import com.coloryr.allmusic.server.core.objs.music.SongInfoObj;
import com.coloryr.allmusic.server.core.utils.HudUtils;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@@ -32,7 +31,7 @@ public class PlayRuntime {
* 启动歌曲工作
*/
public static void start() {
new Thread(PlayRuntime::musicPlayTask, "allMusic_play").start();
new Thread(PlayRuntime::musicPlayTask, "allmusic_play").start();
service = Executors.newSingleThreadScheduledExecutor();
service.scheduleAtFixedRate(PlayRuntime::time1, 0, 10, TimeUnit.MILLISECONDS);
@@ -60,6 +59,15 @@ public class PlayRuntime {
*/
private static void clear() {
isPlay = false;
VoteItem vote = PlayMusic.getVote();
if (vote != null && vote.getType() == VoteItem.VoteType.NEXT
&& vote.getApi().equalsIgnoreCase(PlayMusic.nowPlayMusic.getApi())
&& vote.getId().equalsIgnoreCase(PlayMusic.nowPlayMusic.getId())) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.cancel1);
PlayMusic.removeVote();
}
PlayMusic.musicNowTime = 0;
PlayMusic.musicAllTime = 0;
PlayMusic.musicLessTime = 0;
@@ -108,32 +116,31 @@ public class PlayRuntime {
}
}
private static boolean checkPush() {
SongInfoObj music = PlayMusic.getPush();
if (music != null) {
if (PlayMusic.nowPlayMusic.getID().equalsIgnoreCase(music.getID())) {
return false;
}
List<SongInfoObj> list = PlayMusic.getList();
if (list.isEmpty()) {
return false;
}
SongInfoObj id1 = list.get(0);
if (id1 != null && id1.getID().equalsIgnoreCase(music.getID())) {
return false;
}
for (int a = 1; a < list.size(); a++) {
id1 = list.get(a);
if (id1.getID().equalsIgnoreCase(music.getID()))
return true;
}
}
return false;
public static int getMiniVote() {
return Math.min(AllMusic.getConfig().vote.minVote, AllMusic.side.getPlayers().size());
}
public static int getMiniVote() {
return Math.min(AllMusic.getConfig().minVote, AllMusic.side.getPlayers().size());
public static boolean checkMusic(String id, String api) {
if (PlayMusic.nowPlayMusic.getId().equalsIgnoreCase(id)
&& PlayMusic.nowPlayMusic.getApi().equalsIgnoreCase(api)) {
return true;
}
return PlayMusic.getMusic(id, api) != null;
}
private static void sendVoteInfo(boolean timeout) {
if (timeout) {
VoteItem vote = PlayMusic.getVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.timeOut
.replace(ARG.count, String.valueOf(vote.votePlayer.size()))
.replace(ARG.countAll, String.valueOf(getMiniVote())));
}
int count = PlayMusic.getVoteCount();
if (count > 0) {
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.list
.replace(ARG.count, String.valueOf(count)));
}
}
/**
@@ -145,35 +152,46 @@ public class PlayRuntime {
if (ping >= 10) {
AllMusic.side.ping();
}
if (PlayMusic.getPushTime() > 0) {
if (!checkPush()) {
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.cancel);
VoteItem vote = PlayMusic.getVote();
if (vote != null) {
PlayMusic.voteTick();
if (PlayMusic.getVoteTime() <= 0) {
sendVoteInfo(true);
PlayMusic.removeVote();
} else {
PlayMusic.pushTick();
if (PlayMusic.getPushTime() == 0) {
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.timeOut);
} else {
if (PlayMusic.getPushCount() >= getMiniVote()) {
PlayMusic.pushMusic();
PlayMusic.clearPush();
AllMusic.side.broadcastInTask(AllMusic.getMessage().push.doPush);
}
if (PlayMusic.getVote().votePlayer.size() >= getMiniVote()) {
sendVoteInfo(false);
PlayMusic.doVote();
}
}
}
if (PlayMusic.getVoteTime() > 0) {
PlayMusic.voteTick();
if (PlayMusic.getVoteTime() == 0) {
PlayMusic.clearVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.timeOut);
} else {
if (PlayMusic.getVoteCount() >= getMiniVote()) {
PlayMusic.musicLessTime = 0;
PlayMusic.clearVote();
AllMusic.side.broadcastInTask(AllMusic.getMessage().vote.voteDone);
} else {
vote = PlayMusic.nextVote();
if (vote != null) {
if (vote.getType() == VoteItem.VoteType.NEXT) {
String data = AllMusic.getMessage().vote.bq;
data = data.replace(ARG.player, vote.getVoteSender())
.replace(ARG.time, String.valueOf(AllMusic.getConfig().vote.voteTime))
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().vote.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().vote.bq2, "/music agree")));
} else if (vote.getType() == VoteItem.VoteType.PUSH) {
SongInfoObj music = PlayMusic.getMusic(vote.getId(), vote.getApi());
if (music == null) {
AllMusic.side.broadcast(AllMusic.getMessage().push.err4);
PlayMusic.removeVote();
return;
}
String data = AllMusic.getMessage().push.bq;
data = data.replace(ARG.player, vote.getVoteSender())
.replace(ARG.time, String.valueOf(AllMusic.getConfig().vote.voteTime))
.replace(ARG.musicName, music.getName())
.replace(ARG.musicAuthor, music.getAuthor())
.replace(ARG.countAll, String.valueOf(PlayRuntime.getMiniVote()));
AllMusic.side.broadcast(data);
AllMusic.side.broadcast(AllMusic.side.miniMessage(AllMusic.getMessage().push.bq1)
.append(AllMusic.side.miniMessageRun(AllMusic.getMessage().push.bq2, "/music agree")));
}
}
}
@@ -187,8 +205,9 @@ public class PlayRuntime {
while (AllMusic.isRun) {
try {
if (PlayMusic.getListSize() == 0) {
Thread.sleep(1000);
if (PlayMusic.error >= 10) {
Thread.sleep(1000);
Thread.sleep(10000);
} else if (AllMusic.side.needPlay(true) && PlayMusic.getIdleListSize() > 0) {
MusicObj music = PlayMusic.getIdleMusic();
if (music != null) {
@@ -198,7 +217,6 @@ public class PlayRuntime {
}
}
}
Thread.sleep(1000);
} else {
HudUtils.sendClearHud();
HudUtils.sendHudNowData();
@@ -214,17 +232,17 @@ public class PlayRuntime {
IMusicApi api = AllMusic.MUSIC_APIS.get(PlayMusic.nowPlayMusic.getApi());
PlayMusic.url = PlayMusic.nowPlayMusic.getPlayerUrl() == null ?
api.getPlayUrl(PlayMusic.nowPlayMusic.getID()) :
api.getPlayUrl(PlayMusic.nowPlayMusic.getId()) :
PlayMusic.nowPlayMusic.getPlayerUrl();
if (PlayMusic.url == null) {
String data = AllMusic.getMessage().musicPlay.emptyCanPlay;
AllMusic.side.broadcastInTask(data.replace(ARG.musicId, PlayMusic.nowPlayMusic.getID()));
AllMusic.side.broadcastInTask(data.replace(ARG.musicId, PlayMusic.nowPlayMusic.getId()));
PlayMusic.nowPlayMusic = null;
continue;
}
if (PlayMusic.nowPlayMusic.getPlayerUrl() == null)
PlayMusic.lyric = api.getLyric(PlayMusic.nowPlayMusic.getID());
PlayMusic.lyric = api.getLyric(PlayMusic.nowPlayMusic.getId());
else
PlayMusic.lyric = new LyricSave();
@@ -274,7 +292,7 @@ public class PlayRuntime {
AllMusic.side.sendStop();
} else {
String data = AllMusic.getMessage().musicPlay.emptyCanPlay;
AllMusic.side.broadcastInTask(data.replace(ARG.musicId, PlayMusic.nowPlayMusic.getID()));
AllMusic.side.broadcastInTask(data.replace(ARG.musicId, PlayMusic.nowPlayMusic.getId()));
}
clear();
}
@@ -0,0 +1,40 @@
package com.coloryr.allmusic.server.core.music;
import java.util.HashSet;
import java.util.Set;
public class VoteItem {
public enum VoteType {
NEXT, PUSH
}
public final Set<String> votePlayer = new HashSet<>();
private final String api;
private final String id;
private final VoteType type;
private final String voteSender;
public String getVoteSender() {
return voteSender;
}
public VoteType getType() {
return type;
}
public String getApi() {
return api;
}
public String getId() {
return id;
}
public VoteItem(String api, String id, String voteSender, VoteType type) {
this.api = api;
this.id = id;
this.type = type;
this.voteSender = voteSender;
}
}
@@ -11,22 +11,6 @@ import java.util.Set;
* 配置文件对象
*/
public class ConfigObj {
/**
* 最大歌曲数
*/
public int maxPlayList;
/**
* 一个玩家最大可点数量
*/
public int maxPlayerList;
/**
* 最小通过投票数
*/
public int minVote;
/**
* 投票时间
*/
public int voteTime;
/**
* 歌曲延迟
*/
@@ -103,6 +87,10 @@ public class ConfigObj {
* 花费点歌
*/
public CostObj cost;
/**
* 投票配置
*/
public VoteObj vote;
/**
* 默认音乐API
*/
@@ -153,6 +141,10 @@ public class ConfigObj {
saveConfig = true;
cost = CostObj.make();
}
if (vote == null) {
saveConfig = true;
vote = VoteObj.make();
}
if (lyricReplace == null) {
saveConfig = true;
lyricReplace = new HashMap<>();
@@ -162,11 +154,7 @@ public class ConfigObj {
}
public void init() {
maxPlayerList = 0;
fixSongTime = 0;
maxPlayList = 10;
minVote = 3;
voteTime = 30;
adminList = new HashSet<>();
adminList.add("color_yr");
playListSwitch = true;
@@ -184,6 +172,7 @@ public class ConfigObj {
economy = EconomyObj.make();
funConfig = FunConfigObj.make();
cost = CostObj.make();
vote = VoteObj.make();
ktvMode = true;
ktvLyricDelay = 0;
lyricDelay = 0;
@@ -37,6 +37,14 @@ public class LimitObj {
* 长度替换符号
*/
public String limitText;
/**
* 最大歌曲数
*/
public int maxPlayList;
/**
* 一个玩家最大可点数量
*/
public int maxPlayerList;
public static LimitObj make() {
LimitObj obj = new LimitObj();
@@ -48,6 +56,8 @@ public class LimitObj {
obj.listLimitSize = 10;
obj.messageLimit = false;
obj.messageLimitSize = 20;
obj.maxPlayList = 10;
obj.maxPlayerList = 10;
obj.limitText = "...";
return obj;
}
@@ -0,0 +1,24 @@
package com.coloryr.allmusic.server.core.objs.config;
public class VoteObj {
/**
* 最小通过投票数
*/
public int minVote;
/**
* 投票时间
*/
public int voteTime;
/**
* 投票队列最大大小
*/
public int voteListSize;
public static VoteObj make() {
VoteObj obj = new VoteObj();
obj.minVote = 3;
obj.voteTime = 30;
obj.voteListSize = 10;
return obj;
}
}
@@ -8,6 +8,7 @@ public class HelpNormalObj {
public String cancel;
public String vote;
public String vote1;
public String agree;
public String push;
public String push1;
public String mute;
@@ -98,6 +99,8 @@ public class HelpNormalObj {
return true;
if (hud14 == null)
return true;
if (agree == null)
return true;
return hud5 == null;
}
@@ -162,5 +165,7 @@ public class HelpNormalObj {
hud5 = "<light_purple>[AllMusic]<yellow>/music hud pic speed [数值] 设置图片旋转速度";
if (join == null)
join = "<light_purple>[AllMusic]<yellow>/music join 重新播放当前歌曲";
if (agree == null)
join = "<light_purple>[AllMusic]<yellow>/music agree 同意当前的投票";
}
}
@@ -6,19 +6,16 @@ public class PushObj {
public String bq;
public String bq1;
public String bq2;
public String agree;
public String bqAgree;
public String arAgree;
public String timeOut;
public String doPush;
public String noId;
public String noId1;
public String idErr;
public String pushErr;
public String cancel;
public String cancel1;
public String err1;
public String err2;
public String err3;
public String err4;
public String err5;
public static PushObj make() {
PushObj obj = new PushObj();
@@ -38,30 +35,24 @@ public class PushObj {
return true;
if (bq2 == null)
return true;
if (agree == null)
return true;
if (bqAgree == null)
return true;
if (arAgree == null)
return true;
if (timeOut == null)
return true;
if (noId == null)
return true;
if (noId1 == null)
return true;
if (idErr == null)
return true;
if (pushErr == null)
return true;
if (cancel == null)
return true;
if (err1 == null)
return true;
if (err2 == null)
return true;
if (err3 == null)
return true;
if (err4 == null)
return true;
if (err5 == null)
return true;
if (cancel1 == null)
return true;
return doPush == null;
}
@@ -76,31 +67,23 @@ public class PushObj {
bq1 = "<light_purple>[AllMusic]<yellow>或者点击 ";
if (bq2 == null)
bq2 = "<green><underlined>同意插歌";
if (agree == null)
agree = "<light_purple>[AllMusic]<yellow>你同意插歌";
if (bqAgree == null)
bqAgree = "<light_purple>[AllMusic]<yellow>" + ARG.player + "同意插歌,共有" + ARG.count + "名玩家同意插歌,需要至少" + ARG.countAll + "名玩家同意才会插歌。";
if (arAgree == null)
arAgree = "<light_purple>[AllMusic]<yellow>你已申请插歌";
if (timeOut == null)
timeOut = "<light_purple>[AllMusic]<yellow>插歌时间结束";
if (doPush == null)
doPush = "<light_purple>[AllMusic]<yellow>播放顺序已调整";
if (noId == null)
noId = "<light_purple>[AllMusic]<red>没有找到你的点歌";
if (noId1 == null)
noId1 = "<light_purple>[AllMusic]<red>没有找到序号为" + ARG.index + "的点歌";
if (idErr == null)
idErr = "<light_purple>[AllMusic]<red>错误的歌曲序号";
if (pushErr == null)
pushErr = "<light_purple>[AllMusic]<red>这首歌已经是下一首播放了";
if (err1 == null)
err1 = "<light_purple>[AllMusic]<red>你没有发起插歌";
if (err2 == null)
err2 = "<light_purple>[AllMusic]<red>你发起的插歌已超时";
if (err3 == null)
err3 = "<light_purple>[AllMusic]<red>发起失败,已经有人发起了插歌投票";
if (err4 == null)
err4 = "<light_purple>[AllMusic]<red>切歌投票跳过不存在的音乐投票";
if (err5 == null)
err5 = "<light_purple>[AllMusic]<red>你已经申请过切歌了,不能再继续申请";
if (cancel == null)
cancel = "<light_purple>[AllMusic]<yellow>插歌投票已被发起者取消";
if (cancel1 == null)
cancel1 = "<light_purple>[AllMusic]<yellow>已删除你发起的投票";
}
}
@@ -10,11 +10,14 @@ public class VoteObj {
public String bqAgree;
public String arAgree;
public String timeOut;
public String voteDone;
public String next;
public String err1;
public String err2;
public String err3;
public String err4;
public String err5;
public String cancel;
public String cancel1;
public String list;
public static VoteObj make() {
VoteObj obj = new VoteObj();
@@ -44,13 +47,19 @@ public class VoteObj {
return true;
if (err1 == null)
return true;
if (err2 == null)
return true;
if (err3 == null)
return true;
if (err4 == null)
return true;
if (err5 == null)
return true;
if (cancel == null)
return true;
return voteDone == null;
if (cancel1 == null)
return true;
if (list == null)
return true;
return next == null;
}
public void init() {
@@ -59,7 +68,7 @@ public class VoteObj {
if (doVote == null)
doVote = "<light_purple>[AllMusic]<yellow>已发起切歌投票";
if (bq == null)
bq = "<light_purple>[AllMusic]<yellow>" + ARG.player + "发起了切歌投票," + ARG.time + "秒后结束,输入/music vote 同意切歌,需要至少" + ARG.countAll + "名玩家同意才会切歌。";
bq = "<light_purple>[AllMusic]<yellow>" + ARG.player + "发起了切歌投票," + ARG.time + "秒后结束,输入/music agree 同意切歌,需要至少" + ARG.countAll + "名玩家同意才会切歌。";
if (bq1 == null)
bq1 = "<light_purple>[AllMusic]<yellow>或者点击 ";
if (bq2 == null)
@@ -67,20 +76,26 @@ public class VoteObj {
if (agree == null)
agree = "<light_purple>[AllMusic]<yellow>你同意切歌";
if (bqAgree == null)
bqAgree = "<light_purple>[AllMusic]<yellow>" + ARG.player + "同意切歌,共有" + ARG.count + "名玩家同意切歌,需要至少" + ARG.countAll + "名玩家同意才会切歌。";
bqAgree = "<light_purple>[AllMusic]<yellow>" + ARG.player + "同意投票,共有" + ARG.count + "名玩家同意投票,需要至少" + ARG.countAll + "名玩家同意才会通过。";
if (arAgree == null)
arAgree = "<light_purple>[AllMusic]<yellow>你已申请切歌";
if (timeOut == null)
timeOut = "<light_purple>[AllMusic]<yellow>切歌时间结束";
timeOut = "<light_purple>[AllMusic]<yellow>投票时间结束,共有" + ARG.count + "同意,需要" + ARG.countAll + "才能通过";
if (err1 == null)
err1 = "<light_purple>[AllMusic]<red>你没有发起切歌";
if (err2 == null)
err2 = "<light_purple>[AllMusic]<red>你发起的切歌已超时";
err1 = "<light_purple>[AllMusic]<red>你没有发起过切歌投票";
if (err3 == null)
err3 = "<light_purple>[AllMusic]<red>已经有人发起了切歌";
if (voteDone == null)
voteDone = "<light_purple>[AllMusic]<yellow>已切歌";
err3 = "<light_purple>[AllMusic]<red>这首歌已经在投票中了";
if (err4 == null)
err4 = "<light_purple>[AllMusic]<red>当前没有进行中的投票";
if (err5 == null)
err5 = "<light_purple>[AllMusic]<red>你已经通过了当前投票";
if (next == null)
next = "<light_purple>[AllMusic]<yellow>已切换到播放下一首歌";
if (cancel == null)
cancel = "<light_purple>[AllMusic]<yellow>切歌投票已被发起者取消";
if (cancel1 == null)
cancel1 = "<light_purple>[AllMusic]<yellow>歌曲结束,切歌投票终止";
if (list == null)
list = "<light_purple>[AllMusic]<yellow>剩余" + ARG.count + "个投票";
}
}
@@ -128,7 +128,7 @@ public class SongInfoObj {
name = info;
}
public String getID() {
public String getId() {
return id;
}