166 lines
4.6 KiB
Go
166 lines
4.6 KiB
Go
package model
|
|
|
|
import (
|
|
"backend/client"
|
|
"backend/msg"
|
|
"backend/util"
|
|
"fmt"
|
|
"log"
|
|
|
|
"google.golang.org/protobuf/encoding/protojson"
|
|
"google.golang.org/protobuf/proto"
|
|
)
|
|
|
|
type ActivityMod struct {
|
|
AppId int `json:"AppId" db:"AppId"`
|
|
ActivityType int `json:"activityType" db:"activityType"`
|
|
Cfg *Activity `json:"Cfg" 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"`
|
|
}
|
|
|
|
func (a *ActivityMod) ActivityList() ([]Activity, error) {
|
|
var activityList []Activity
|
|
// do something
|
|
AppCfg, err := util.GetAppConfig(a.AppId)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
Db := util.MPool.GetMysqlDB(AppCfg, 1)
|
|
if Db == nil {
|
|
return nil, fmt.Errorf("failed to get mysql db")
|
|
}
|
|
defer Db.Close()
|
|
where := ""
|
|
if a.ActivityType != 0 {
|
|
where = fmt.Sprintf("WHERE `type`=%d", a.ActivityType)
|
|
}
|
|
err = Db.Select(&activityList, fmt.Sprintf("SELECT id, `type`, start_time, end_time, level_limit, title, mail_title, mail_content, cfg, extra FROM t_activity_mod %s order by id desc", where))
|
|
if err != nil {
|
|
return nil, fmt.Errorf("failed to scan rows: %v", err)
|
|
}
|
|
return 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=? 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.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) 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)
|
|
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 {
|
|
switch a.Type {
|
|
case 1:
|
|
m := &msg.MiningCfg{}
|
|
err := protojson.Unmarshal([]byte(a.Cfg), m)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to unmarshal proto message: %v", err)
|
|
}
|
|
binaryData, err := proto.Marshal(m)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to marshal proto message: %v", err)
|
|
}
|
|
a.CfgBuf = binaryData
|
|
return nil
|
|
default:
|
|
//return fmt.Errorf("unknown activity type: %d", a.Type)
|
|
}
|
|
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 send admin message: %v", err)
|
|
}
|
|
log.Printf("sent reload mail message to server %d", server.ServerId)
|
|
}(server)
|
|
}
|
|
return nil
|
|
}
|