admin_backend/model/activity.go
2026-04-14 16:17:58 +08:00

179 lines
5.7 KiB
Go

package model
import (
"backend/client"
"backend/util"
"fmt"
"log"
)
type ActivityMod struct {
AppId int `json:"AppId" db:"AppId"`
ActivityType int `json:"activityType" db:"activityType"`
Cfg *Activity `json:"Cfg" db:"-"`
Page int `json:"CurrentPage" db:"-"`
PageSize int `json:"PageSize" db:"-"`
}
type Activity struct {
Id int `json:"id" db:"id"`
Type int `json:"type" db:"type"`
StartTime int64 `json:"start_time" db:"start_time"`
EndTime int64 `json:"end_time" db:"end_time"`
Level int `json:"level" db:"level_limit"`
Title string `json:"title" db:"title"`
MailTitle string `json:"mail_title" db:"mail_title"`
MailContent string `json:"mail_content" db:"mail_content"`
Cfg string `json:"cfg" db:"cfg"`
CfgBuf []byte `json:"-" db:"cfg_buf"`
Extra string `json:"extra" db:"extra"`
Interval int `json:"interval" db:"interval"`
}
func (a *ActivityMod) ActivityList() (int, []Activity, error) {
var activityList []Activity
// do something
AppCfg, err := util.GetAppConfig(a.AppId)
if err != nil {
return 0, nil, err
}
Db := util.MPool.GetMysqlDB(AppCfg, 1)
if Db == nil {
return 0, nil, fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
where := ""
if a.ActivityType != 0 {
where = fmt.Sprintf("WHERE `type`=%d", a.ActivityType)
}
var total int
err = Db.Get(&total, fmt.Sprintf("SELECT COUNT(*) FROM t_activity_mod %s", where))
if err != nil {
return 0, nil, fmt.Errorf("failed to get total count: %v", err)
}
err = Db.Select(&activityList, fmt.Sprintf("SELECT id, `type`, `start_time`, `end_time`, `level_limit`, `title`, `mail_title`, `mail_content`, `cfg`, `extra`, `interval` FROM t_activity_mod %s order by id desc limit %d, %d", where, (a.Page-1)*a.PageSize, a.PageSize))
if err != nil {
return 0, nil, fmt.Errorf("failed to scan rows: %v", err)
}
return total, activityList, nil
}
func (a *ActivityMod) Edit() error {
err := a.Cfg.Mashal()
if err != nil {
return err
}
AppCfg, err := util.GetAppConfig(a.AppId)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, 1)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
_, err = Db.Exec("UPDATE t_activity_mod SET type=?, start_time=?, end_time=?, level_limit=?, title=?, mail_title=?, mail_content=?, cfg=?, cfg_buf=?, extra=?, `interval`=? WHERE id=?",
a.Cfg.Type, a.Cfg.StartTime, a.Cfg.EndTime, a.Cfg.Level, a.Cfg.Title, a.Cfg.MailTitle, a.Cfg.MailContent, a.Cfg.Cfg, a.Cfg.CfgBuf, a.Cfg.Extra, a.Cfg.Interval, a.Cfg.Id)
if err != nil {
return fmt.Errorf("failed to update activity: %v", err)
}
// reload cfg
err = a.reloadCfg()
if err != nil {
log.Printf("failed to reload activity cfg: %v", err)
}
return nil
}
func (a *ActivityMod) Add() error {
err := a.Cfg.Mashal()
if err != nil {
return err
}
AppCfg, err := util.GetAppConfig(a.AppId)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, 1)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
_, err = Db.Exec("INSERT INTO t_activity_mod (type, start_time, end_time, level_limit, title, mail_title, mail_content, cfg, cfg_buf, extra, `interval`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
a.Cfg.Type, a.Cfg.StartTime, a.Cfg.EndTime, a.Cfg.Level, a.Cfg.Title, a.Cfg.MailTitle, a.Cfg.MailContent, a.Cfg.Cfg, a.Cfg.CfgBuf, a.Cfg.Extra, a.Cfg.Interval)
if err != nil {
return fmt.Errorf("failed to insert activity: %v", err)
}
// reload cfg
err = a.reloadCfg()
if err != nil {
log.Printf("failed to reload activity cfg: %v", err)
}
return nil
}
func (a *ActivityMod) Delete() error {
AppCfg, err := util.GetAppConfig(a.AppId)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, 1)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
_, err = Db.Exec("DELETE FROM t_activity_mod WHERE id=?", a.Cfg.Id)
if err != nil {
return fmt.Errorf("failed to delete activity: %v", err)
}
// reload cfg
err = a.reloadCfg()
if err != nil {
log.Printf("failed to reload activity cfg: %v", err)
}
return nil
}
func (a *Activity) Mashal() error {
return nil
}
func (a *ActivityMod) reloadCfg() error {
ServerList := util.GetServerInfo(a.AppId, 0)
for _, server := range ServerList {
go func(serverInfo util.ServerConfig) {
err := client.ActivityCfgReload(serverInfo.AppId, serverInfo.ServerId, nil)
if err != nil {
log.Printf("failed to sync activity cfg: %v", err)
}
log.Printf("sent reload activity cfg message to server %d", server.ServerId)
}(server)
}
return nil
}
func (a *ActivityMod) Sync(dest int) error {
_, list, err := a.ActivityList()
if err != nil {
return err
}
AppCfg, err := util.GetAppConfig(dest)
if err != nil {
return err
}
Db := util.MPool.GetMysqlDB(AppCfg, 1)
if Db == nil {
return fmt.Errorf("failed to get mysql db")
}
defer Db.Close()
for _, activity := range list {
_, err = Db.Exec("INSERT INTO t_activity_mod (id, type, start_time, end_time, level_limit, title, mail_title, mail_content, cfg, cfg_buf, extra, `interval`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE type=?, start_time=?, end_time=?, level_limit=?, title=?, mail_title=?, mail_content=?, cfg=?, cfg_buf=?, extra=?, `interval`=?",
activity.Id, activity.Type, activity.StartTime, activity.EndTime, activity.Level, activity.Title, activity.MailTitle, activity.MailContent, activity.Cfg, activity.CfgBuf, activity.Extra, activity.Interval,
activity.Type, activity.StartTime, activity.EndTime, activity.Level, activity.Title, activity.MailTitle, activity.MailContent, activity.Cfg, activity.CfgBuf, activity.Extra, activity.Interval)
if err != nil {
return fmt.Errorf("failed to sync activity: %v", err)
}
}
return nil
}