2024-04-17 22:15:12 +08:00
package coloryr.allmusic.core.sql ;
2021-09-03 18:21:46 +08:00
2023-03-02 08:42:34 +08:00
import coloryr.allmusic.core.AllMusic ;
2024-04-17 22:15:12 +08:00
import coloryr.allmusic.core.music.play.PlayMusic ;
import coloryr.allmusic.core.objs.enums.HudDirType ;
import coloryr.allmusic.core.utils.HudUtils ;
2023-08-03 10:15:57 +08:00
import coloryr.allmusic.core.objs.config.SaveObj ;
2023-10-22 10:14:55 +08:00
import coloryr.allmusic.core.objs.hud.PosObj ;
2021-09-03 18:21:46 +08:00
import java.io.File ;
2024-04-17 22:15:12 +08:00
import java.sql.* ;
2021-09-03 18:21:46 +08:00
import java.text.MessageFormat ;
2024-04-17 22:15:12 +08:00
import java.util.ArrayList ;
import java.util.List ;
2021-09-03 18:21:46 +08:00
import java.util.Queue ;
import java.util.concurrent.ConcurrentLinkedQueue ;
2022-12-27 10:31:41 +08:00
import java.util.concurrent.Semaphore ;
2021-09-03 18:21:46 +08:00
public class DataSql {
private static final Queue < Runnable > tasks = new ConcurrentLinkedQueue <> ();
2022-12-27 10:31:41 +08:00
private static final Semaphore semaphore = new Semaphore ( 0 );
2023-01-06 17:27:35 +08:00
/**
* 创建表用
*/
2024-04-17 22:15:12 +08:00
private static final String table = "CREATE TABLE IF NOT EXISTS \"allmusic\" (\n" +
2021-09-03 18:21:46 +08:00
" \"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
" \"name\" TEXT(20),\n" +
" \"info_x\" integer(6),\n" +
" \"info_y\" integer(6),\n" +
2024-04-17 22:15:12 +08:00
" \"info_color\" integer(20),\n" +
" \"info_dir\" integer(6),\n" +
" \"info_shadow\" integer(1),\n" +
2021-09-03 18:21:46 +08:00
" \"info_enable\" integer(1),\n" +
" \"lyric_x\" integer(6),\n" +
" \"lyric_y\" integer(6),\n" +
2024-04-17 22:15:12 +08:00
" \"lyric_color\" integer(20),\n" +
" \"lyric_dir\" integer(6),\n" +
" \"lyric_shadow\" integer(1),\n" +
2021-09-03 18:21:46 +08:00
" \"lyric_enable\" integer(1),\n" +
" \"list_x\" integer(6),\n" +
" \"list_y\" integer(6),\n" +
2024-04-17 22:15:12 +08:00
" \"list_color\" integer(20),\n" +
" \"list_dir\" integer(6),\n" +
" \"list_shadow\" integer(1),\n" +
2021-09-03 18:21:46 +08:00
" \"list_enable\" integer(1),\n" +
" \"pic_x\" integer(6),\n" +
" \"pic_y\" integer(6),\n" +
2024-04-17 22:15:12 +08:00
" \"pic_dir\" integer(6),\n" +
2022-06-19 16:24:15 +08:00
" \"pic_size\" integer(6),\n" +
2023-01-09 15:56:26 +08:00
" \"pic_enable\" integer(1),\n" +
" \"pic_rotate\" integer(1),\n" +
" \"pic_rotate_speed\" integer(6)\n" +
2021-09-03 18:21:46 +08:00
");" ;
2024-04-17 22:15:12 +08:00
private static final String table1 = "CREATE TABLE IF NOT EXISTS \"allmusic_list\" (\n" +
" \"id\" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,\n" +
" \"sid\" TEXT(40)\n" +
");" ;
2023-01-06 17:27:35 +08:00
/**
* 数据库文件
*/
2021-11-30 13:37:43 +08:00
public static File sqlFile ;
2023-01-08 20:55:21 +08:00
private static boolean isRun ;
/**
* 数据库链接对象
*/
private static Connection connection ;
2021-09-03 18:21:46 +08:00
2023-01-06 17:27:35 +08:00
/**
* 初始化数据库
*/
2021-09-03 18:21:46 +08:00
public static void init () {
try {
2022-12-27 10:31:41 +08:00
AllMusic . log . info ( "正在初始化数据库" );
2021-09-03 18:21:46 +08:00
if ( connection != null )
connection . close ();
Class . forName ( "org.sqlite.JDBC" );
2021-11-30 13:37:43 +08:00
connection = DriverManager . getConnection ( "jdbc:sqlite:" + sqlFile . getPath ());
2021-09-03 18:21:46 +08:00
Statement stat = connection . createStatement ();
2024-04-17 22:15:12 +08:00
stat . execute ( table );
stat . execute ( table1 );
2021-09-03 18:21:46 +08:00
stat . close ();
} catch ( Exception e ) {
e . printStackTrace ();
}
}
2023-01-06 17:27:35 +08:00
/**
* 检查玩家是否在数据库
2023-01-08 20:55:21 +08:00
*
2023-01-06 17:27:35 +08:00
* @param name 用户名
* @return 结果
*/
2021-09-03 18:21:46 +08:00
public static boolean check ( String name ) {
try {
boolean have = false ;
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
Statement stat = connection . createStatement ();
ResultSet set = stat . executeQuery ( "SELECT allmusic.id FROM allmusic WHERE allmusic.name ='" + name + "'" );
if ( set . next ()) {
have = true ;
}
set . close ();
stat . close ();
return have ;
} catch ( Exception e ) {
e . printStackTrace ();
}
return false ;
}
2023-01-06 17:27:35 +08:00
/**
* 更新玩家Hud数据
2023-01-08 20:55:21 +08:00
*
2023-01-06 17:27:35 +08:00
* @param name 用户名
2023-01-08 20:55:21 +08:00
* @param hud Hud数据
2023-01-06 17:27:35 +08:00
*/
2023-01-09 16:54:42 +08:00
private static void update ( String name , SaveObj hud ) {
2021-09-03 18:21:46 +08:00
String sql = "" ;
try {
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
Statement stat = connection . createStatement ();
2024-04-17 22:15:12 +08:00
sql = MessageFormat . format ( "UPDATE allmusic SET info_x={0},info_y={1},info_color={15},info_dir={16},info_shadow={17},info_enable={2},lyric_x={3},lyric_y={4},lyric_color={18},lyric_dir={19},lyric_shadow={20},lyric_enable={5},list_x={6},list_y={7}, list_color={21},list_dir={22},list_shadow={23},list_enable={8},pic_x={9},pic_y={10},pic_dir={24},pic_enable={11},pic_size={12},pic_rotate={13},pic_rotate_speed={14} WHERE name=@name" ,
hud . info . x , hud . info . y , hud . info . enable ? 1 : 0 ,
hud . lyric . x , hud . lyric . y , hud . lyric . enable ? 1 : 0 ,
hud . list . x , hud . list . y , hud . list . enable ? 1 : 0 ,
hud . pic . x , hud . pic . y , hud . pic . enable ? 1 : 0 ,
hud . pic . color , hud . pic . shadow ? 1 : 0 ,
hud . picRotateSpeed , hud . info . color , hud . info . dir . ordinal (),
hud . info . shadow ? 1 : 0 , hud . lyric . color , hud . lyric . dir . ordinal (),
hud . lyric . shadow ? 1 : 0 , hud . list . color , hud . list . dir . ordinal (),
hud . list . shadow ? 1 : 0 , hud . pic . dir . ordinal ());
2021-09-03 18:21:46 +08:00
sql = sql . replace ( "@name" , "'" + name + "'" );
stat . execute ( sql );
stat . close ();
} catch ( Exception e ) {
AllMusic . log . info ( sql );
e . printStackTrace ();
}
}
2023-01-06 17:27:35 +08:00
/**
* 添加用户Hud数据
2023-01-08 20:55:21 +08:00
*
2023-01-06 17:27:35 +08:00
* @param name 用户名
2023-01-08 20:55:21 +08:00
* @param hud 数据
2023-01-06 17:27:35 +08:00
*/
2023-01-09 16:54:42 +08:00
public static void addUser ( String name , SaveObj hud ) {
2021-09-03 18:21:46 +08:00
String sql = "" ;
try {
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
if ( check ( name )) {
update ( name , hud );
} else {
Statement stat = connection . createStatement ();
2023-01-09 15:56:26 +08:00
sql = MessageFormat . format ( "INSERT INTO allmusic (name,info_x,info_y," +
"info_enable,lyric_x,lyric_y,lyric_enable,list_x,list_y,list_enable," +
2024-04-17 22:15:12 +08:00
"pic_x,pic_y,pic_enable,pic_size,pic_rotate,pic_rotate_speed," +
"info_color,info_dir,info_shadow,lyric_color,lyric_dir," +
"lyric_shadow,list_color,list_dir,list_shadow,pic_dir)" +
"VALUES (@name,{0},{1},{2},{3},{4},{5},{6},{7},{8},{9},{10},{11},{12},{13},{14},{15},{16},{17},{18},{19},{20},{21},{22},{23},{24})" ,
hud . info . x , hud . info . y , hud . info . enable ? 1 : 0 ,
hud . lyric . x , hud . lyric . y , hud . lyric . enable ? 1 : 0 ,
hud . list . x , hud . list . y , hud . list . enable ? 1 : 0 ,
hud . pic . x , hud . pic . y , hud . pic . enable ? 1 : 0 ,
hud . pic . color , hud . pic . shadow ? 1 : 0 ,
hud . picRotateSpeed , hud . info . color , hud . info . dir . ordinal (),
hud . info . shadow ? 1 : 0 , hud . lyric . color , hud . lyric . dir . ordinal (),
hud . lyric . shadow ? 1 : 0 , hud . list . color , hud . list . dir . ordinal (),
hud . list . shadow ? 1 : 0 , hud . pic . dir . ordinal ());
2021-09-03 18:21:46 +08:00
sql = sql . replace ( "@name" , "'" + name + "'" );
stat . execute ( sql );
stat . close ();
}
} catch ( Exception e ) {
AllMusic . log . info ( sql );
e . printStackTrace ();
}
}
2023-01-06 17:27:35 +08:00
/**
* 读取所有数据
*/
2021-09-03 18:21:46 +08:00
private static void readAll () {
try {
2024-04-17 22:15:12 +08:00
AllMusic . log . info ( "正在读取玩家数据" );
2021-09-03 18:21:46 +08:00
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
Statement stat = connection . createStatement ();
2024-04-17 22:15:12 +08:00
ResultSet set = stat . executeQuery ( "SELECT name,info_x,info_y,info_enable,lyric_x," +
"lyric_y,lyric_enable,list_x,list_y,list_enable,pic_x,pic_y,pic_enable,pic_size," +
"pic_rotate,pic_rotate_speed,info_color,info_dir,info_shadow,lyric_color," +
"lyric_dir,lyric_shadow,list_color,list_dir,list_shadow,pic_dir FROM allmusic" );
HudDirType [] vas = HudDirType . values ();
2021-09-03 18:21:46 +08:00
while ( set . next ()) {
String name = set . getString ( 1 );
2023-01-09 16:54:42 +08:00
SaveObj obj = new SaveObj ();
PosObj pos1 = new PosObj ();
2023-01-06 17:27:35 +08:00
pos1 . x = set . getInt ( 2 );
pos1 . y = set . getInt ( 3 );
2024-04-17 22:15:12 +08:00
obj . info = pos1 ;
obj . info . enable = set . getInt ( 4 ) == 1 ;
2023-01-09 16:54:42 +08:00
PosObj pos2 = new PosObj ();
2023-01-06 17:27:35 +08:00
pos2 . x = set . getInt ( 5 );
pos2 . y = set . getInt ( 6 );
2024-04-17 22:15:12 +08:00
obj . lyric = pos2 ;
obj . lyric . enable = set . getInt ( 7 ) == 1 ;
2023-01-09 16:54:42 +08:00
PosObj pos3 = new PosObj ();
2023-01-06 17:27:35 +08:00
pos3 . x = set . getInt ( 8 );
pos3 . y = set . getInt ( 9 );
2024-04-17 22:15:12 +08:00
obj . list = pos3 ;
obj . list . enable = set . getInt ( 10 ) == 1 ;
2023-01-09 16:54:42 +08:00
PosObj pos4 = new PosObj ();
2023-01-06 17:27:35 +08:00
pos4 . x = set . getInt ( 11 );
pos4 . y = set . getInt ( 12 );
2024-04-17 22:15:12 +08:00
obj . pic = pos4 ;
obj . pic . enable = set . getInt ( 13 ) == 1 ;
obj . pic . color = set . getInt ( 14 );
obj . pic . shadow = set . getInt ( 15 ) == 1 ;
obj . picRotateSpeed = set . getInt ( 16 );
obj . info . color = set . getInt ( 17 );
obj . info . dir = vas [ set . getInt ( 18 ) ] ;
obj . info . shadow = set . getInt ( 19 ) == 1 ;
obj . lyric . color = set . getInt ( 20 );
obj . lyric . dir = vas [ set . getInt ( 21 ) ] ;
obj . lyric . shadow = set . getInt ( 22 ) == 1 ;
obj . list . color = set . getInt ( 23 );
obj . list . dir = vas [ set . getInt ( 24 ) ] ;
obj . list . shadow = set . getInt ( 25 ) == 1 ;
obj . list . dir = vas [ set . getInt ( 26 ) ] ;
2023-01-06 18:15:10 +08:00
HudUtils . add ( name , obj );
2021-09-03 18:21:46 +08:00
}
stat . close ();
} catch ( Exception e ) {
2023-01-09 15:56:26 +08:00
AllMusic . log . warning ( "数据库读取错误,请删除关闭服务器删除数据库,在启动服务器" );
2021-09-03 18:21:46 +08:00
e . printStackTrace ();
}
}
2024-04-17 22:15:12 +08:00
/**
* 读取空闲歌单列表
*/
private static void readAllList (){
try {
AllMusic . log . info ( "正在读取空闲歌单" );
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
Statement stat = connection . createStatement ();
ResultSet set = stat . executeQuery ( "SELECT sid FROM allmusic_list" );
List < String > list = new ArrayList <> ();
while ( set . next ()) {
String name = set . getString ( 1 );
list . add ( name );
}
stat . close ();
PlayMusic . addIdleList ( list );
} catch ( Exception e ) {
AllMusic . log . warning ( "数据库读取错误,请删除关闭服务器删除数据库,在启动服务器" );
e . printStackTrace ();
}
}
public static void addIdleList ( List < String > list ) {
task (() -> {
try {
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
String arrayAsString = String . join ( "," , list );
PreparedStatement pstmt = connection . prepareStatement ( "INSERT INTO allmusic_list (sid) VALUES (?)" );
pstmt . setString ( 1 , arrayAsString );
pstmt . execute ();
pstmt . close ();
} catch ( Exception e ) {
e . printStackTrace ();
}
});
}
public static void clearIdleList () {
task (() -> {
try {
if ( connection . isReadOnly () || connection . isClosed ()) {
init ();
}
Statement stat = connection . createStatement ();
stat . execute ( "DELETE FROM allmusic_list" );
stat . close ();
} catch ( Exception e ) {
e . printStackTrace ();
}
});
}
2021-09-03 18:21:46 +08:00
public static void task ( Runnable runnable ) {
tasks . add ( runnable );
2022-12-27 10:31:41 +08:00
semaphore . release ();
2021-09-03 18:21:46 +08:00
}
2023-01-06 17:27:35 +08:00
/**
* 启用Hud数据库
*/
2021-09-03 18:21:46 +08:00
public static void start () {
init ();
readAll ();
2024-04-17 22:15:12 +08:00
readAllList ();
2022-02-01 21:38:39 +08:00
Thread thread = new Thread ( DataSql :: run );
2021-09-03 18:21:46 +08:00
isRun = true ;
thread . start ();
}
2023-01-06 17:27:35 +08:00
/**
* 停止数据库
*/
2021-09-03 18:21:46 +08:00
public static void stop () {
isRun = false ;
2022-12-27 10:31:41 +08:00
semaphore . release ();
2023-01-06 18:15:10 +08:00
HudUtils . save ();
2021-09-03 18:21:46 +08:00
}
private static void run () {
Runnable runnable ;
while ( isRun ) {
try {
2022-12-27 10:31:41 +08:00
semaphore . acquire ();
if ( ! isRun )
return ;
do {
runnable = tasks . poll ();
if ( runnable != null ) {
runnable . run ();
}
2021-09-03 18:21:46 +08:00
}
2022-12-27 10:31:41 +08:00
while ( runnable != null );
2021-09-03 18:21:46 +08:00
} catch ( Exception e ) {
e . printStackTrace ();
}
}
}
}