```
feat(common): 添加GlowFilter的Level字段 添加了GlowFilter结构体中的Level字段,用于表示等级信息, 对应JSON标签为"level,omitempty" --- fix(utils): 修复concurrent_swiss_map中的panic处理 - 使用goroutine替代线程池来监听通道 - 添加panic恢复机制,当发生panic时记录错误日志 - 确保在异常情况下程序能够
This commit is contained in:
@@ -10,6 +10,7 @@ import (
|
||||
"blazing/modules/base/service"
|
||||
|
||||
config "blazing/modules/config/service"
|
||||
dict "blazing/modules/dict/service"
|
||||
blazing "blazing/modules/player/service"
|
||||
playerservice "blazing/modules/player/service"
|
||||
|
||||
@@ -66,13 +67,8 @@ func (c *BaseSysUserController) GetSession(ctx context.Context, req *SessionReq)
|
||||
res.IsReg = 1
|
||||
|
||||
}
|
||||
|
||||
if cool.Config.ServerInfo.IsDebug != 0 {
|
||||
res.LoginAddr = "192.168.1.44" + ":" + cool.Config.LoginPort
|
||||
} else {
|
||||
res.LoginAddr = cool.Config.File.Domain + ":" + cool.Config.LoginPort
|
||||
}
|
||||
res.Server = config.NewServerService().GetPort()
|
||||
res.PetID = dict.NewDictInfoService().GetShiny()
|
||||
res.Server = config.NewServerService().GetPort(int(t1.Debug))
|
||||
// share.ShareManager.DeleteSession(t1)
|
||||
ser := playerservice.NewUserService(uint32(t1.ID))
|
||||
kickErr := ser.Info.Kick(uint32(t1.ID))
|
||||
@@ -91,11 +87,12 @@ func (c *BaseSysUserController) GetSession(ctx context.Context, req *SessionReq)
|
||||
}
|
||||
|
||||
type SessionRes struct {
|
||||
IsReg int `json:"isreg"`
|
||||
UserID int `json:"userid"`
|
||||
Session string `json:"session"`
|
||||
LoginAddr string `json:"loginaddr"`
|
||||
Server gdb.List `json:"server"`
|
||||
IsReg int `json:"isreg"`
|
||||
UserID int `json:"userid"`
|
||||
Session string `json:"session"`
|
||||
|
||||
Server gdb.List `json:"server"`
|
||||
PetID []int `json:"petid"`
|
||||
}
|
||||
|
||||
type RegReq struct {
|
||||
|
||||
@@ -58,11 +58,8 @@ func init() {
|
||||
g.Server().BindHandler("/server/*", func(r *ghttp.Request) {
|
||||
servert := new(ServerHandler)
|
||||
id := gconv.Uint16(r.URL.Query().Get("id"))
|
||||
|
||||
servert.isinstall = gconv.Uint32(r.URL.Query().Get("isinstall"))
|
||||
if servert.isinstall != 0 {
|
||||
servert.ServerList = service.NewServerService().StartUPdate(id)
|
||||
}
|
||||
servert.ServerList = service.NewServerService().StartUPdate(id, int(servert.isinstall))
|
||||
|
||||
upgrader := gws.NewUpgrader(servert, &gws.ServerOption{
|
||||
|
||||
|
||||
@@ -197,93 +197,11 @@ else
|
||||
command -v screen || { echo "❌ Screen安装失败"; exit 1; }
|
||||
fi
|
||||
|
||||
|
||||
#!/bin/bash
|
||||
# 核心:无任何可能阻塞的命令,全程实时输出,100%不卡住 + 彻底清理所有logic会话
|
||||
set -euo pipefail
|
||||
|
||||
# ===== 仅需配置这1个变量 =====
|
||||
SCREEN_NAME="logic"
|
||||
|
||||
# ===== 颜色输出函数(确保能看到输出)=====
|
||||
red() { echo -e "\033[31m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
green() { echo -e "\033[32m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
yellow() { echo -e "\033[33m[$(date +%H:%M:%S)] $1\033[0m"; }
|
||||
|
||||
# ===== 新增:彻底清理screen会话(核心修复)=====
|
||||
clean_screen_sessions() {
|
||||
local sess_id=$1
|
||||
# 1. 先优雅关闭screen会话
|
||||
screen -S "${sess_id}" -X quit >/dev/null 2>&1 || true
|
||||
sleep 0.3
|
||||
# 2. 提取会话PID并强制杀死
|
||||
local sess_pid=$(echo "${sess_id}" | cut -d. -f1)
|
||||
if [ -n "${sess_pid}" ]; then
|
||||
kill -9 "${sess_pid}" >/dev/null 2>&1 || true
|
||||
# 3. 杀死该PID的所有子进程
|
||||
pkill -9 -P "${sess_pid}" >/dev/null 2>&1 || true
|
||||
fi
|
||||
}
|
||||
|
||||
# ===== 强制关闭所有阻塞的后台进程(先清场)=====
|
||||
green "【步骤1/5】清理脚本自身可能的阻塞进程"
|
||||
pkill -f "screen_clean_*" >/dev/null 2>&1 || true
|
||||
pkill -9 -f "pgrep -f SCREEN -S ${SCREEN_NAME}" >/dev/null 2>&1 || true
|
||||
|
||||
# ===== 非阻塞查找进程+会话(关键:延长超时到1秒,查更全)=====
|
||||
green "【步骤2/5】查找${SCREEN_NAME}相关进程/会话(非阻塞)"
|
||||
# 先查screen会话ID(1秒超时,避免漏查)
|
||||
SCREEN_SESS=$(timeout 1 screen -ls 2>/dev/null | grep -E "[0-9]+\\.${SCREEN_NAME}" | grep -v "Dead" | awk '{print $1}' || true)
|
||||
# 再查进程PID
|
||||
SCREEN_PIDS=$(timeout 1 pgrep -f "SCREEN -S ${SCREEN_NAME}" | grep -v $$ || true)
|
||||
|
||||
# 合并需要清理的目标
|
||||
if [ -z "${SCREEN_SESS}" ] && [ -z "${SCREEN_PIDS}" ]; then
|
||||
green "✅ 未找到${SCREEN_NAME}相关进程/会话,无需清理"
|
||||
else
|
||||
yellow "⚠️ 找到${SCREEN_NAME}会话:${SCREEN_SESS:-无}"
|
||||
yellow "⚠️ 找到${SCREEN_NAME}进程:${SCREEN_PIDS:-无}"
|
||||
|
||||
# ===== 非阻塞强制清理(先清会话,再清进程)=====
|
||||
green "【步骤3/5】强制清理${SCREEN_NAME}进程及会话"
|
||||
# 1. 清理所有screen会话
|
||||
if [ -n "${SCREEN_SESS}" ]; then
|
||||
for sess in ${SCREEN_SESS}; do
|
||||
yellow "🔧 清理会话:${sess}"
|
||||
clean_screen_sessions "${sess}"
|
||||
done
|
||||
fi
|
||||
# 2. 清理剩余进程(兜底)
|
||||
if [ -n "${SCREEN_PIDS}" ]; then
|
||||
for pid in ${SCREEN_PIDS}; do
|
||||
yellow "🔧 清理进程:${pid}"
|
||||
kill -9 "${pid}" >/dev/null 2>&1 || true
|
||||
pkill -9 -P "${pid}" >/dev/null 2>&1 || true
|
||||
done
|
||||
fi
|
||||
|
||||
# 短暂等待(0.5秒,非阻塞)
|
||||
sleep 0.5
|
||||
|
||||
# ===== 验证清理结果(查会话+进程,双重验证)=====
|
||||
green "【步骤4/5】验证清理结果(会话+进程双重检查)"
|
||||
FINAL_SESS=$(timeout 1 screen -ls 2>/dev/null | grep -E "[0-9]+\\.${SCREEN_NAME}" | grep -v "Dead" || true)
|
||||
FINAL_PIDS=$(timeout 1 pgrep -f "SCREEN -S ${SCREEN_NAME}" | grep -v $$ || true)
|
||||
|
||||
if [ -z "${FINAL_SESS}" ] && [ -z "${FINAL_PIDS}" ]; then
|
||||
green "✅ ${SCREEN_NAME}进程/会话已全部清理完成"
|
||||
else
|
||||
red "❌ 仍有残留:会话[${FINAL_SESS}] 进程[${FINAL_PIDS}],再次强制清理"
|
||||
# 终极兜底:强制杀死所有相关进程
|
||||
pkill -9 -f "${SCREEN_NAME}" >/dev/null 2>&1 || true
|
||||
fi
|
||||
fi
|
||||
|
||||
# ===== 最终收尾 =====
|
||||
green "【步骤5/5】${SCREEN_NAME}会话清理流程结束"
|
||||
green "✅ 自动化部署后续流程可正常执行"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# ===== 准备下载目录 =====
|
||||
@@ -311,10 +229,8 @@ echo "下载链接:%s{file_url}"
|
||||
echo "目标路径:%s{exe_path}"
|
||||
|
||||
# 删除旧文件(关键修复:这里要判断目标路径,不是下载链接)
|
||||
if [ -f "%s{exe_path}" ]; then
|
||||
echo "删除旧文件:%s{exe_path}"
|
||||
rm -f "%s{exe_path}"
|
||||
fi
|
||||
echo "删除旧文件:%s{exe_path}"
|
||||
rm -f "%s{exe_path}"
|
||||
|
||||
echo "开始下载..."
|
||||
DOWNLOAD_SUCCESS=0
|
||||
|
||||
@@ -98,6 +98,8 @@ type GroupAttributes struct {
|
||||
IsHidden int `json:"isHidden"`
|
||||
}
|
||||
|
||||
var bbsurl = "http://43.248.3.21:45632"
|
||||
|
||||
// GetUserInfo 输入用户名和密码,返回用户信息结构体
|
||||
func GetUserInfo(username, password string) (*UserResponse, error) {
|
||||
// 创建带 Cookie 存储的 HTTP 客户端
|
||||
@@ -108,7 +110,7 @@ func GetUserInfo(username, password string) (*UserResponse, error) {
|
||||
client := &http.Client{Jar: jar}
|
||||
|
||||
// 1. POST 获取 token
|
||||
tokenURL := "http://bs.seersun.com/api/token"
|
||||
tokenURL := bbsurl + "/api/token"
|
||||
formData := url.Values{}
|
||||
formData.Set("identification", username)
|
||||
formData.Set("password", password)
|
||||
@@ -141,7 +143,7 @@ func GetUserInfo(username, password string) (*UserResponse, error) {
|
||||
csrfToken := resp.Header.Get("X-CSRF-Token")
|
||||
|
||||
// 2. GET 获取该用户的详细信息
|
||||
usersURL := fmt.Sprintf("http://bs.seersun.com/api/users/%d", tokenResp.UserID)
|
||||
usersURL := bbsurl + fmt.Sprintf("/api/users/%d", tokenResp.UserID)
|
||||
req2, err := http.NewRequest("GET", usersURL, nil)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("创建请求失败: %w", err)
|
||||
|
||||
Reference in New Issue
Block a user