diff --git a/models/discord/discord.go b/models/discord/discord.go index 8b52e76..d47ab13 100644 --- a/models/discord/discord.go +++ b/models/discord/discord.go @@ -84,6 +84,7 @@ func (p *DiscordServerModel) Write() error { if err != nil { return err } + row.Next() err = row.StructScan(p) if err != nil { return err diff --git a/models/public/command.go b/models/public/command.go index 01c96f0..be63ee7 100644 --- a/models/public/command.go +++ b/models/public/command.go @@ -21,7 +21,7 @@ type CommandModel struct { // NewCommand - func NewCommand(key, value, platform, binding string, requireManage, requireInit bool) (c *CommandModel, err error) { if len(key) == 0 || len(value) == 0 { - return nil, errors.New("cmd, server or value is empty") + return nil, errors.New("key, server or value is empty") } c = &CommandModel{ @@ -100,10 +100,10 @@ func GetGlobalCommand(key string) (list []*CommandModel, err error) { return nil, errors.New("key is empty") } db := models.GetConn() - query := `select "cmd", "server", "value", "require_manage", "require_init", "ctime", "mtime" + query := `select "key", "platform", "binding", "value", "require_manage", "require_init", "ctime", "mtime" from "command" where - "cmd" = $1 + "key" = $1 and "platform" = '' and "binding" = ''` err = db.Select(&list, query, key) diff --git a/pkg/svc/discord/actions.go b/pkg/svc/discord/actions.go index 2c73ba7..2df00ca 100644 --- a/pkg/svc/discord/actions.go +++ b/pkg/svc/discord/actions.go @@ -1,6 +1,39 @@ package discord -// SendDiscordMessage - -func SendDiscordMessage(channel string) (err error) { - return +import ( + dsmodel "dorisbot/models/discord" + "log" +) + +func addServer(info EvtInfo, name string) string { + exists, err := dsmodel.GetDiscordServerByID(info.Server) + if err != nil { + log.Println("check server exists fail :: ", err) + return "check server info fail" + } + if exists != nil { + return "server already setup" + } + + ds, err := dsmodel.NewDiscordServer(info.Server, name, 0) + if err != nil { + log.Println("create dsmodel fail :: ", err) + return "create server data fail" + } + + log.Println("show info :: ", info) + owner, err := client.GetGuildOwner(info.Server) + if err != nil { + log.Println("get server owner err :: ", err) + return "get server owner fail" + } + ds.Owner = owner + + err = ds.Write() + if err != nil { + log.Println("write server data fail :: ", err) + return "write server data fail" + } + + return "add server success" } diff --git a/pkg/svc/discord/discord.go b/pkg/svc/discord/discord.go index fc4d2cd..db30d77 100644 --- a/pkg/svc/discord/discord.go +++ b/pkg/svc/discord/discord.go @@ -51,6 +51,9 @@ func NewClient(token string) (*DiscordClient, error) { return client, nil } +// GetClient - +func GetClient() *DiscordClient { return client } + // Connect to discord websocket func (p *DiscordClient) Connect() error { if p.connected == true { @@ -69,7 +72,7 @@ func (p *DiscordClient) Close() error { // GetGuildOwner - func (p *DiscordClient) GetGuildOwner(guild string) (ownerID string, err error) { - if len(ownerID) == 0 { + if len(guild) == 0 { return "", ErrGuildIDEmpty } guildInfo, err := p.Session.Guild(guild) @@ -110,7 +113,8 @@ func (p *DiscordClient) GetGuildRoles(guild string) (roles []GuildRole, err erro } // SendMessage - -func (p *DiscordClient) SendMessage() error { - - return nil +func (p *DiscordClient) SendMessage(channel, message string) error { + var err error + _, err = p.Session.ChannelMessageSend(channel, message) + return err } diff --git a/pkg/svc/discord/events.go b/pkg/svc/discord/events.go index 74d7a20..5f235d7 100644 --- a/pkg/svc/discord/events.go +++ b/pkg/svc/discord/events.go @@ -4,11 +4,20 @@ import ( dsmodel "dorisbot/models/discord" pubmodel "dorisbot/models/public" "dorisbot/pkg/cmdparser" + "fmt" "log" + "strings" "github.com/bwmarrin/discordgo" ) +// EvtInfo - event source info +type EvtInfo struct { + Server string + Channel string + User string +} + func messageCreateEvt(s *discordgo.Session, evt *discordgo.MessageCreate) { // skip bot message if evt.Author.ID == client.ID { @@ -42,60 +51,33 @@ func messageCreateEvt(s *discordgo.Session, evt *discordgo.MessageCreate) { // discord server not init if server == nil { - cmdmodel, acrs, err = getNotInitServerCommandAction(s, evt, cmd) + cmdmodel, acts, err = getNotInitServerCommandAction(s, evt, cmd) } else { - cmds, err := pubmodel.GetCommandByPlatformBinding(cmd, server.ID, "discord") - if err != nil { - log.Println("get command err :: ", err) - return - } - if len(cmds) == 0 { - log.Printf("no command found {%s}\n", cmd) - return - } - c := cmds[0] - - if c.RequireManage && server.Owner != uid { - roles, err := server.GetRoleList() - if err != nil { - log.Println("get server role err :: ", err) - return - } - rolePass := false - if len(roles) > 0 { - uinfo, err := s.GuildMember(guildID, uid) - if err != nil { - log.Println("get guild user info err :: ", err) - return - } - if len(uinfo.Roles) > 0 { - allPass := false - for _, it := range roles { - if allPass { - break - } - for _, rid := range uinfo.Roles { - if it.RoleID == rid { - rolePass = true - break - } - } - } - } - } - if !rolePass { - log.Printf("{%s} require manage role\n", cmd) - return - } - } - - cmdmodel = c - acts = cmdparser.ParseCmdAction(cmdmodel.Value) + cmdmodel, acts, err = getRegServerCommandAction(s, evt, server, cmd) } if len(acts) == 0 { - // TODO: response cmd value + if cmdmodel == nil { + log.Println("cmd is nil") + return + } + client.SendMessage(channelID, cmdmodel.Value) + return } + + info := EvtInfo{ + Server: guildID, + Channel: channelID, + User: uid, + } + + for _, it := range acts { + res := selectAction(info, it.Key, it.Value, payload) + // TODO: command result parse message type + cmdmodel.Value = strings.ReplaceAll(cmdmodel.Value, fmt.Sprintf("{{%s}}", it.Origin), res) + } + + client.SendMessage(channelID, cmdmodel.Value) } func guildMemberAddEvt(s *discordgo.Session, evt *discordgo.GuildMemberAdd) {} diff --git a/pkg/svc/discord/parser.go b/pkg/svc/discord/parser.go index 0684b1c..1cdb972 100644 --- a/pkg/svc/discord/parser.go +++ b/pkg/svc/discord/parser.go @@ -7,6 +7,7 @@ import ( "regexp" "strings" + dsmodel "dorisbot/models/discord" pubmodel "dorisbot/models/public" "dorisbot/pkg/cmdparser" @@ -48,7 +49,58 @@ func getCMD(str string) (cmd string, keyword bool) { return } -func getNotInitServerCommandAction(s discordgo.Session, msgEvt *discordgo.MessageCreate, cmd string) (c *pubmodel.CommandModel, acts []*cmdparser.CmdAction, err error) { +func getRegServerCommandAction(s *discordgo.Session, msgEvt *discordgo.MessageCreate, server *dsmodel.DiscordServerModel, cmd string) (c *pubmodel.CommandModel, acts []*cmdparser.CmdAction, err error) { + cmds, err := pubmodel.GetCommandByPlatformBinding(cmd, server.ID, "discord") + if err != nil { + log.Println("get command err :: ", err) + return + } + if len(cmds) == 0 { + log.Printf("no command found {%s}\n", cmd) + return + } + c = cmds[0] + + if c.RequireManage && server.Owner != msgEvt.Author.ID { + roles, err := server.GetRoleList() + if err != nil { + log.Println("get server role err :: ", err) + return nil, nil, err + } + rolePass := false + if len(roles) > 0 { + uinfo, err := s.GuildMember(msgEvt.GuildID, msgEvt.Author.ID) + if err != nil { + log.Println("get guild user info err :: ", err) + return nil, nil, err + } + if len(uinfo.Roles) > 0 { + allPass := false + for _, it := range roles { + if allPass { + break + } + for _, rid := range uinfo.Roles { + if it.RoleID == rid { + rolePass = true + break + } + } + } + } + } + if !rolePass { + s := fmt.Sprintf("{%s} require manage role", cmd) + log.Println(s) + return nil, nil, errors.New(s) + } + } + + acts = cmdparser.ParseCmdAction(c.Value) + return c, acts, nil +} + +func getNotInitServerCommandAction(s *discordgo.Session, msgEvt *discordgo.MessageCreate, cmd string) (c *pubmodel.CommandModel, acts []*cmdparser.CmdAction, err error) { cmds, err := pubmodel.GetGlobalCommand(cmd) if err != nil { log.Println("get command fail :: ", err) @@ -59,7 +111,7 @@ func getNotInitServerCommandAction(s discordgo.Session, msgEvt *discordgo.Messag log.Println(s) return nil, nil, errors.New(s) } - c := cmds[0] + c = cmds[0] if c.RequireInit { s := fmt.Sprintf("{%s} require init server", cmd) log.Println(s) @@ -67,19 +119,19 @@ func getNotInitServerCommandAction(s discordgo.Session, msgEvt *discordgo.Messag } if c.RequireManage { - ginfo, err := s.Guild(guildID) + ginfo, err := s.Guild(msgEvt.GuildID) if err != nil { log.Println("get guild info err :: ", err) return nil, nil, err } - if ginfo.OwnerID != uid { + if ginfo.OwnerID != msgEvt.Author.ID { s := fmt.Sprintf("{%s} require manage permission", cmd) log.Println(s) return nil, nil, errors.New(s) } } - acts = cmdparser.ParseCmdAction(cmdmodel.Value) + acts = cmdparser.ParseCmdAction(c.Value) return c, acts, nil } @@ -97,9 +149,11 @@ func parseTextMessage(msg string) (cmd string, keyword bool, payload string) { return } -func selectAction(key, value, payload string) { +func selectAction(info EvtInfo, key, value, payload string) string { switch key { case "ds_addserver": - break + return addServer(info, payload) } + + return "" }