add commad sys
This commit is contained in:
parent
bdd2e0b0cc
commit
7cc675bfda
@ -84,6 +84,7 @@ func (p *DiscordServerModel) Write() error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
row.Next()
|
||||||
err = row.StructScan(p)
|
err = row.StructScan(p)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -21,7 +21,7 @@ type CommandModel struct {
|
|||||||
// NewCommand -
|
// NewCommand -
|
||||||
func NewCommand(key, value, platform, binding string, requireManage, requireInit bool) (c *CommandModel, err error) {
|
func NewCommand(key, value, platform, binding string, requireManage, requireInit bool) (c *CommandModel, err error) {
|
||||||
if len(key) == 0 || len(value) == 0 {
|
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{
|
c = &CommandModel{
|
||||||
@ -100,10 +100,10 @@ func GetGlobalCommand(key string) (list []*CommandModel, err error) {
|
|||||||
return nil, errors.New("key is empty")
|
return nil, errors.New("key is empty")
|
||||||
}
|
}
|
||||||
db := models.GetConn()
|
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"
|
from "command"
|
||||||
where
|
where
|
||||||
"cmd" = $1
|
"key" = $1
|
||||||
and "platform" = ''
|
and "platform" = ''
|
||||||
and "binding" = ''`
|
and "binding" = ''`
|
||||||
err = db.Select(&list, query, key)
|
err = db.Select(&list, query, key)
|
||||||
|
@ -1,6 +1,39 @@
|
|||||||
package discord
|
package discord
|
||||||
|
|
||||||
// SendDiscordMessage -
|
import (
|
||||||
func SendDiscordMessage(channel string) (err error) {
|
dsmodel "dorisbot/models/discord"
|
||||||
return
|
"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"
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,9 @@ func NewClient(token string) (*DiscordClient, error) {
|
|||||||
return client, nil
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetClient -
|
||||||
|
func GetClient() *DiscordClient { return client }
|
||||||
|
|
||||||
// Connect to discord websocket
|
// Connect to discord websocket
|
||||||
func (p *DiscordClient) Connect() error {
|
func (p *DiscordClient) Connect() error {
|
||||||
if p.connected == true {
|
if p.connected == true {
|
||||||
@ -69,7 +72,7 @@ func (p *DiscordClient) Close() error {
|
|||||||
|
|
||||||
// GetGuildOwner -
|
// GetGuildOwner -
|
||||||
func (p *DiscordClient) GetGuildOwner(guild string) (ownerID string, err error) {
|
func (p *DiscordClient) GetGuildOwner(guild string) (ownerID string, err error) {
|
||||||
if len(ownerID) == 0 {
|
if len(guild) == 0 {
|
||||||
return "", ErrGuildIDEmpty
|
return "", ErrGuildIDEmpty
|
||||||
}
|
}
|
||||||
guildInfo, err := p.Session.Guild(guild)
|
guildInfo, err := p.Session.Guild(guild)
|
||||||
@ -110,7 +113,8 @@ func (p *DiscordClient) GetGuildRoles(guild string) (roles []GuildRole, err erro
|
|||||||
}
|
}
|
||||||
|
|
||||||
// SendMessage -
|
// SendMessage -
|
||||||
func (p *DiscordClient) SendMessage() error {
|
func (p *DiscordClient) SendMessage(channel, message string) error {
|
||||||
|
var err error
|
||||||
return nil
|
_, err = p.Session.ChannelMessageSend(channel, message)
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
|
@ -4,11 +4,20 @@ import (
|
|||||||
dsmodel "dorisbot/models/discord"
|
dsmodel "dorisbot/models/discord"
|
||||||
pubmodel "dorisbot/models/public"
|
pubmodel "dorisbot/models/public"
|
||||||
"dorisbot/pkg/cmdparser"
|
"dorisbot/pkg/cmdparser"
|
||||||
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"github.com/bwmarrin/discordgo"
|
"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) {
|
func messageCreateEvt(s *discordgo.Session, evt *discordgo.MessageCreate) {
|
||||||
// skip bot message
|
// skip bot message
|
||||||
if evt.Author.ID == client.ID {
|
if evt.Author.ID == client.ID {
|
||||||
@ -42,60 +51,33 @@ func messageCreateEvt(s *discordgo.Session, evt *discordgo.MessageCreate) {
|
|||||||
|
|
||||||
// discord server not init
|
// discord server not init
|
||||||
if server == nil {
|
if server == nil {
|
||||||
cmdmodel, acrs, err = getNotInitServerCommandAction(s, evt, cmd)
|
cmdmodel, acts, err = getNotInitServerCommandAction(s, evt, cmd)
|
||||||
} else {
|
} else {
|
||||||
cmds, err := pubmodel.GetCommandByPlatformBinding(cmd, server.ID, "discord")
|
cmdmodel, acts, err = getRegServerCommandAction(s, evt, server, cmd)
|
||||||
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)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(acts) == 0 {
|
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) {}
|
func guildMemberAddEvt(s *discordgo.Session, evt *discordgo.GuildMemberAdd) {}
|
||||||
|
@ -7,6 +7,7 @@ import (
|
|||||||
"regexp"
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
dsmodel "dorisbot/models/discord"
|
||||||
pubmodel "dorisbot/models/public"
|
pubmodel "dorisbot/models/public"
|
||||||
"dorisbot/pkg/cmdparser"
|
"dorisbot/pkg/cmdparser"
|
||||||
|
|
||||||
@ -48,7 +49,58 @@ func getCMD(str string) (cmd string, keyword bool) {
|
|||||||
return
|
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)
|
cmds, err := pubmodel.GetGlobalCommand(cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("get command fail :: ", err)
|
log.Println("get command fail :: ", err)
|
||||||
@ -59,7 +111,7 @@ func getNotInitServerCommandAction(s discordgo.Session, msgEvt *discordgo.Messag
|
|||||||
log.Println(s)
|
log.Println(s)
|
||||||
return nil, nil, errors.New(s)
|
return nil, nil, errors.New(s)
|
||||||
}
|
}
|
||||||
c := cmds[0]
|
c = cmds[0]
|
||||||
if c.RequireInit {
|
if c.RequireInit {
|
||||||
s := fmt.Sprintf("{%s} require init server", cmd)
|
s := fmt.Sprintf("{%s} require init server", cmd)
|
||||||
log.Println(s)
|
log.Println(s)
|
||||||
@ -67,19 +119,19 @@ func getNotInitServerCommandAction(s discordgo.Session, msgEvt *discordgo.Messag
|
|||||||
}
|
}
|
||||||
|
|
||||||
if c.RequireManage {
|
if c.RequireManage {
|
||||||
ginfo, err := s.Guild(guildID)
|
ginfo, err := s.Guild(msgEvt.GuildID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Println("get guild info err :: ", err)
|
log.Println("get guild info err :: ", err)
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
if ginfo.OwnerID != uid {
|
if ginfo.OwnerID != msgEvt.Author.ID {
|
||||||
s := fmt.Sprintf("{%s} require manage permission", cmd)
|
s := fmt.Sprintf("{%s} require manage permission", cmd)
|
||||||
log.Println(s)
|
log.Println(s)
|
||||||
return nil, nil, errors.New(s)
|
return nil, nil, errors.New(s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
acts = cmdparser.ParseCmdAction(cmdmodel.Value)
|
acts = cmdparser.ParseCmdAction(c.Value)
|
||||||
return c, acts, nil
|
return c, acts, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -97,9 +149,11 @@ func parseTextMessage(msg string) (cmd string, keyword bool, payload string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func selectAction(key, value, payload string) {
|
func selectAction(info EvtInfo, key, value, payload string) string {
|
||||||
switch key {
|
switch key {
|
||||||
case "ds_addserver":
|
case "ds_addserver":
|
||||||
break
|
return addServer(info, payload)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user