@@ -1,5 +1,6 @@
package com.mcreport.plugin ;
import com.google.gson.JsonArray ;
import com.google.gson.JsonObject ;
import org.bukkit.Bukkit ;
import org.bukkit.command.Command ;
@@ -7,7 +8,7 @@ import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender ;
import org.bukkit.entity.Player ;
import java.util.Arrays ;
import java.util.* ;
public class ReportCommand implements CommandExecutor {
@@ -20,7 +21,7 @@ public class ReportCommand implements CommandExecutor {
@Override
public boolean onCommand ( CommandSender sender , Command command , String label , String [ ] args ) {
if ( ! ( sender instanceof Player player ) ) {
sender . sendMessage ( " §c仅玩家可使用此命令 " ) ;
sender . sendMessage ( " §cPlayer only " ) ;
return true ;
}
@@ -29,99 +30,76 @@ public class ReportCommand implements CommandExecutor {
return true ;
}
String sub = args [ 0 ] . toLowerCase ( ) ;
switch ( sub ) {
case " login " : return handleLogin ( player , args ) ;
switch ( args [ 0 ] . toLowerCase ( ) ) {
case " reg " : case " register " : return handleRegister ( player , args ) ;
case " track " : return handleTrack ( player , args ) ;
case " 举报 " : return handleRepor t ( player , args , " report " ) ;
case " 建议 " : return handleRepor t ( player , args , " suggestion " ) ;
case " 事项 " : return handleReport ( player , args , " report " );
case " login " : return handleLogin ( player , args ) ;
case " report " : case " r " : return handleSubmi t ( player , args , " report " ) ;
case " suggest " : case " s " : return handleSubmi t ( player , args , " suggestion " ) ;
case " track " : case " t " : return handleTrack ( player , args ) ;
default : showHelp ( player ) ; return true ;
}
}
private void showHelp ( Player player ) {
player . sendMessage ( " §6===== MC举报系统 ===== " ) ;
String token = plugin . getToken ( player ) ;
if ( token = = null ) {
player . sendMessage ( " §e/report reg <密码> <邮箱> §7- 注册账号 " ) ;
player . sendMessage ( " §e/report login <密码> §7- 登录 " ) ;
if ( plugin . getToken ( player ) = = null ) {
player . sendMessage ( " §6===== MCReport ===== " ) ;
player . sendMessage ( " §e/report reg <password> <email> [username] §7- Register " ) ;
player . sendMessage ( " §e/report login <password> [username] §7- Login " ) ;
} else {
player . sendMessage ( " §e/report 举报 [玩家名] <原因> §7- 举报玩家 " ) ;
player . sendMessage ( " §e/report 建议 <内容> §7- 提交建议 " ) ;
player . sendMessage ( " §e/report 事项 <内容> §7- 事项提交 " ) ;
player . sendMessage ( " §e/report track <工单ID> §7- 追踪进度 " ) ;
player . sendMessage ( " §6===== MCReport ===== " ) ;
player . sendMessage ( " §e/report report [player] <reason> §7- Report a player " ) ;
player . sendMessage ( " §e/report suggest <content> §7- Submit suggestion " ) ;
player . sendMessage ( " §e/report track [id] §7- List/view tickets " ) ;
}
}
private boolean handleLogin ( Player player , String [ ] args ) {
if ( args . length < 2 ) {
player . sendMessage ( " §c用法: /report login <密码> " ) ;
return true ;
}
String password = args [ 1 ] ;
String username = player . getName ( ) ;
if ( args . length < 2 ) { player . sendMessage ( " §cUsage: /report login <password> [username] " ) ; return true ; }
String pwd = args [ 1 ] ;
String username = args . length > 2 ? args [ 2 ] : player . getName ( ) ;
player . sendMessage ( " §7登录中 ... " ) ;
player . sendMessage ( " §7Logging in ... " ) ;
Bukkit . getScheduler ( ) . runTaskAsynchronously ( plugin , ( ) - > {
JsonObject res = plugin . getApiClient ( ) . login ( username , passwor d ) ;
JsonObject res = plugin . getApiClient ( ) . login ( username , pw d ) ;
int status = res . get ( " _status " ) . getAsInt ( ) ;
if ( status = = 200 ) {
String token = res . get ( " token " ) . getAsString ( ) ;
plugin . setToken ( player , token ) ;
player . sendMessage ( " §a登录成功!现在可以使用 /report 提交举报 " ) ;
plugin . setToken ( player , res . get ( " token " ) . getAsString ( ) ) ;
plugin . setLoginName ( player , username ) ;
player . sendMessage ( " §aLogged in as §e " + username ) ;
} else {
String err = res . has ( " error " ) ? res . get ( " error " ) . getAsString ( ) : " 未知错误 " ;
player . sendMessage ( " §c登录失败: " + err ) ;
player . sendMessage ( " §cLogin failed: " + res . get ( " error " ) . getAsString ( ) ) ;
}
} ) ;
return true ;
}
private boolean handleRegister ( Player player , String [ ] args ) {
if ( args . length < 3 ) {
player . sendMessage ( " §c用法: /report reg <密码> <邮箱> " ) ;
return true ;
}
String password = args [ 1 ] ;
if ( args . length < 3 ) { player . sendMessage ( " §cUsage: /report reg <password> <email> [username] " ) ; return true ; }
String pwd = args [ 1 ] ;
String email = args [ 2 ] ;
String username = args . length > 3 ? args [ 3 ] : player . getName ( ) ;
if ( passwor d . length ( ) < 6 ) {
player . sendMessage ( " §c密码至少6位 " ) ;
return true ;
}
if ( pw d . length ( ) < 6 ) { player . sendMessage ( " §cPassword must be at least 6 characters " ) ; return true ; }
player . sendMessage ( " §7注册中 ... " ) ;
player . sendMessage ( " §7Registering ... " ) ;
Bukkit . getScheduler ( ) . runTaskAsynchronously ( plugin , ( ) - > {
JsonObject res = plugin . getApiClient ( ) . register (
player . getName ( ) , passwor d , email ,
username , pw d , email ,
player . getName ( ) , player . getUniqueId ( ) . toString ( )
) ;
int status = res . get ( " _status " ) . getAsInt ( ) ;
if ( status = = 201 ) {
String msg = res . get ( " message " ) . getAsString ( ) ;
player . sendMessage ( " §a " + msg ) ;
if ( msg . contains ( " 自动激活 " ) ) {
player . sendMessage ( " §e账号已激活, 请使用 §a/report login <密码> §e登录 " ) ;
} else {
player . sendMessage ( " §e请查收邮箱验证邮件后使用 §a/report login <密码> §e登录 " ) ;
}
player . sendMessage ( " §a " + res . get ( " message " ) . getAsString ( ) ) ;
player . sendMessage ( " §6Username: §e " + username + " §6Game: §e " + player . getName ( ) ) ;
} else {
String err = res . has ( " error " ) ? res . get ( " error " ) . getAsString ( ) : " 未知错误 " ;
player . sendMessage ( " §c注册失败: " + err ) ;
player . sendMessage ( " §cRegister failed: " + res . get ( " error " ) . getAsString ( ) ) ;
}
} ) ;
return true ;
}
private boolean handleRepor t ( Player player , String [ ] args , String type ) {
String token = plugin . getToken ( player ) ;
if ( token = = null ) {
player . sendMessage ( " §c请先登录: /report login <密码> " ) ;
return true ;
}
private boolean handleSubmi t ( Player player , String [ ] args , String type ) {
if ( plugin . getToken ( player ) = = null ) { player . sendMessage ( " §cLogin first: /report login <password> " ) ; return true ; }
int contentStart = 1 ;
String targetName = null ;
@@ -139,59 +117,97 @@ public class ReportCommand implements CommandExecutor {
}
if ( args . length < = contentStart ) {
player . sendMessage ( " §c请填写 " + ( type . equals ( " report " ) ? " 举报原因 " : type . equals ( " suggestion " ) ? " 建议内容 " : " 事项内容 " ) ) ;
player . sendMessage ( " §cPlease provide " + ( type . equals ( " report " ) ? " a reason " : " content " ) ) ;
return true ;
}
String content = String . join ( " " , Arrays . copyOfRange ( args , contentStart , args . length ) ) ;
String reason = type . equals ( " report " ) ? content : null ;
String description = type . equals ( " suggestion " ) ? content : ( type . equals ( " report " ) ? null : content ) ;
String title = targetName ! = null
? " 游戏内举报 : " + targetName
? " In-game report : " + targetName
: type . equals ( " suggestion " )
? " 游戏内建议 : " + player . getName ( )
: " 游戏内举报 : " + player . getName ( ) ;
? " In-game suggestion : " + player . getName ( )
: " In-game report : " + player . getName ( ) ;
player . sendMessage ( " §7提交中 ... " ) ;
player . sendMessage ( " §7Submitting ... " ) ;
Bukkit . getScheduler ( ) . runTaskAsynchronously ( plugin , ( ) - > {
JsonObject res = plugin . getApiClient ( ) . submitTicket (
token , type , title ,
plugin . getToken ( player ) , type , title ,
player . getName ( ) , player . getUniqueId ( ) . toString ( ) ,
targetName , targetUid , reason , description , isAdminComplaint
targetName , targetUid ,
type . equals ( " report " ) ? content : null ,
type . equals ( " suggestion " ) ? content : null ,
isAdminComplaint
) ;
int status = res . get ( " _status " ) . getAsInt ( ) ;
if ( status = = 200 | | status = = 201 ) {
int id = res . get ( " id " ) . getAsInt ( ) ;
String tracking = res . get ( " tracking_token " ) . getAsString ( ) ;
player . sendMessage ( " §a提交成功! 工单编号: §e# " + id ) ;
player . sendMessage ( " §7追踪码: " + tracking . substring ( 0 , 8 ) + " ... " ) ;
player . sendMessage ( " §7可使用 /report track " + id + " 查询进度 " ) ;
if ( res . get ( " _status " ) . getAsInt ( ) = = 200 | | res . get ( " _status " ) . getAsInt ( ) = = 201 ) {
player . sendMessage ( " §aSubmitted! Ticket §e# " + res . get ( " id " ) . getAsInt ( ) ) ;
player . sendMessa ge( " §7Use §e/report track §7to check progress " ) ;
} else {
String err = res . has ( " error " ) ? res . get ( " error " ) . getAsString ( ) : " 未知错误 " ;
player . sendMessage ( " §c提交失败: " + err ) ;
player . sendMessage ( " §cFailed: " + res . get ( " error " ) . getAsString ( ) ) ;
}
} ) ;
return true ;
}
private boolean handleTrack ( Player player , String [ ] args ) {
if ( args . length < 2 ) {
player . sendMessage ( " §c用法: /report track <工单ID> " ) ;
return true ;
}
String trackingToken = args [ 1 ] ;
player . sendMessage ( " §7查询中... " ) ;
if ( plugin . getToken ( player ) = = null ) { player . sendMessage ( " §cLogin first " ) ; return true ; }
player . sendMessage ( " §7Loading... " ) ;
Bukkit . getScheduler ( ) . runTaskAsynchronously ( plugin , ( ) - > {
JsonObject res = plugin . getApiClient ( ) . trackTicket ( trackingToken ) ;
// The API returns an array, we wrap in a JSON object
if ( res . has ( " error " ) ) {
player . sendMessage ( " §c工单不存在或无权查看 " ) ;
return ;
if ( args . length > 1 ) {
JsonObject res = plugin . getApiClient ( ) . getTicket ( plugin . getToken ( player ) , args [ 1 ] ) ;
showTicketDetail ( player , res ) ;
} else {
JsonObject res = plugin . getApiClient ( ) . getMyTickets ( plugin . getToken ( player ) ) ;
showTicketList ( player , res ) ;
}
player . sendMessage ( " §6===== 工单列表 ===== " ) ;
player . sendMessage ( " §e可通过 Web 端查看详情 " ) ;
} ) ;
return true ;
}
private void showTicketList ( Player player , JsonObject res ) {
if ( res . get ( " _status " ) . getAsInt ( ) ! = 200 | | ! res . has ( " list " ) ) {
player . sendMessage ( " §cFailed to load tickets " ) ;
return ;
}
JsonArray list = res . getAsJsonArray ( " list " ) ;
if ( list . size ( ) = = 0 ) {
player . sendMessage ( " §7No tickets yet " ) ;
return ;
}
player . sendMessage ( " §6===== Your Tickets (last " + list . size ( ) + " ) ===== " ) ;
for ( int i = 0 ; i < list . size ( ) ; i + + ) {
JsonObject t = list . get ( i ) . getAsJsonObject ( ) ;
String type = t . get ( " type " ) . getAsString ( ) ;
String typeLabel = type . equals ( " report " ) ? " 雷 " : type . equals ( " suggestion " ) ? " 灯 " : type . equals ( " appeal " ) ? " 锤 " : " ? " ;
String status = t . get ( " status " ) . getAsString ( ) ;
String statusColor = " " ;
switch ( status ) {
case " pending " : statusColor = " §e " ; break ;
case " processing " : statusColor = " §d " ; break ;
case " resolved " : statusColor = " §a " ; break ;
case " rejected " : statusColor = " §c " ; break ;
case " closed " : statusColor = " §7 " ; break ;
case " awaiting_info " : statusColor = " §6 " ; break ;
case " appealing " : statusColor = " §c " ; break ;
}
player . sendMessage ( " §e# " + t . get ( " id " ) . getAsInt ( ) + " §7 " + statusColor + status + " §f " + t . get ( " title " ) . getAsString ( ) . substring ( 0 , Math . min ( 30 , t . get ( " title " ) . getAsString ( ) . length ( ) ) ) ) ;
}
player . sendMessage ( " §7Use §e/report track <id> §7for details " ) ;
}
private void showTicketDetail ( Player player , JsonObject res ) {
if ( res . get ( " _status " ) . getAsInt ( ) ! = 200 | | res . has ( " error " ) ) {
player . sendMessage ( " §cTicket not found " ) ;
return ;
}
JsonObject t = res ;
player . sendMessage ( " §6===== Ticket # " + t . get ( " id " ) . getAsInt ( ) + " ===== " ) ;
player . sendMessage ( " §eTitle: §f " + t . get ( " title " ) . getAsString ( ) ) ;
player . sendMessage ( " §eStatus: §f " + t . get ( " status " ) . getAsString ( ) ) ;
player . sendMessage ( " §eType: §f " + t . get ( " type " ) . getAsString ( ) ) ;
if ( t . has ( " assigned_to " ) & & ! t . get ( " assigned_to " ) . isJsonNull ( ) ) {
player . sendMessage ( " §eHandler: §f# " + t . get ( " assigned_to " ) . getAsInt ( ) ) ;
}
player . sendMessage ( " §eDate: §7 " + t . get ( " created_at " ) . getAsString ( ) ) ;
}
}