admin_backend/model/activity.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
}