add new bot code
This commit is contained in:
@@ -0,0 +1,80 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
|
||||
"git.trj.tw/golang/utils"
|
||||
"gopkg.in/yaml.v2"
|
||||
)
|
||||
|
||||
// Database struct
|
||||
type Database struct {
|
||||
DBName string `yaml:"dbname"`
|
||||
Host string `yaml:"host"`
|
||||
Port int `yaml:"port"`
|
||||
User string `yaml:"user"`
|
||||
Pass string `yaml:"pass"`
|
||||
SSLCa string `yaml:"ssl_ca"`
|
||||
SSLCrt string `yaml:"ssl_crt"`
|
||||
SSLKey string `yaml:"ssl_key"`
|
||||
SSLMode string `yaml:"ssl_mode"`
|
||||
}
|
||||
|
||||
// Discord struct
|
||||
type Discord struct {
|
||||
BotToken string `yaml:"bot_token"`
|
||||
}
|
||||
|
||||
// Config -
|
||||
type Config struct {
|
||||
Port int `yaml:"port"`
|
||||
Database *Database `yaml:"database"`
|
||||
Discord *Discord `yaml:"discord"`
|
||||
}
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrConfigFileNotFound = errors.New("config file not found")
|
||||
)
|
||||
|
||||
var conf *Config
|
||||
|
||||
// GetConfig -
|
||||
func GetConfig() *Config { return conf }
|
||||
|
||||
// LoadConfig file
|
||||
func LoadConfig(p ...string) (err error) {
|
||||
fp := ""
|
||||
if len(p) > 0 && len(p[0]) > 0 {
|
||||
fp = p[0]
|
||||
} else {
|
||||
wd, err := os.Getwd()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
fp = path.Join(wd, "config.yml")
|
||||
}
|
||||
|
||||
fp = utils.ParsePath(fp)
|
||||
|
||||
if exists := utils.CheckExists(fp, false); !exists {
|
||||
return ErrConfigFileNotFound
|
||||
}
|
||||
|
||||
fileData, err := ioutil.ReadFile(fp)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
conf = &Config{}
|
||||
|
||||
err = yaml.Unmarshal(fileData, conf)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package options
|
||||
|
||||
import "flag"
|
||||
|
||||
// Options -
|
||||
type Options struct {
|
||||
Help bool
|
||||
Config string
|
||||
}
|
||||
|
||||
var opts *Options
|
||||
|
||||
// GetOptions -
|
||||
func GetOptions() *Options { return opts }
|
||||
|
||||
// RegOptions -
|
||||
func RegOptions() {
|
||||
opts = &Options{}
|
||||
flag.StringVar(&opts.Config, "config", "", "config file path")
|
||||
flag.StringVar(&opts.Config, "f", "", "config file path (short)")
|
||||
flag.BoolVar(&opts.Help, "h", false, "show usage")
|
||||
flag.Parse()
|
||||
}
|
||||
|
||||
// ShowUsage -
|
||||
func (p *Options) ShowUsage() {
|
||||
flag.Usage()
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
package discord
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
)
|
||||
|
||||
// DiscordClient -
|
||||
type DiscordClient struct {
|
||||
Session *discordgo.Session
|
||||
ID string
|
||||
connected bool
|
||||
}
|
||||
|
||||
// Errors
|
||||
var (
|
||||
ErrTokenEmpty = errors.New("token is empty")
|
||||
ErrGuildIDEmpty = errors.New("guild id is empty")
|
||||
)
|
||||
|
||||
var client *DiscordClient
|
||||
|
||||
// NewClient -
|
||||
func NewClient(token string) (*DiscordClient, error) {
|
||||
if len(token) == 0 {
|
||||
return nil, ErrTokenEmpty
|
||||
}
|
||||
var err error
|
||||
|
||||
client = &DiscordClient{}
|
||||
client.Session, err = discordgo.New(fmt.Sprintf("Bot %s", token))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
// register event
|
||||
client.Session.AddHandler(messageCreateEvt)
|
||||
client.Session.AddHandler(guildMemberAddEvt)
|
||||
client.Session.AddHandler(guildMemberRemoveEvt)
|
||||
client.Session.AddHandler(rateLimitEvt)
|
||||
client.Session.AddHandler(connectEvt)
|
||||
client.Session.AddHandler(disconnectEvt)
|
||||
|
||||
botInfo, err := client.Session.User("@me")
|
||||
if err != nil {
|
||||
return client, err
|
||||
}
|
||||
client.ID = botInfo.ID
|
||||
|
||||
return client, nil
|
||||
}
|
||||
|
||||
// Connect to discord websocket
|
||||
func (p *DiscordClient) Connect() error {
|
||||
if p.connected == true {
|
||||
return nil
|
||||
}
|
||||
return p.Session.Open()
|
||||
}
|
||||
|
||||
// Close discord websocket connection
|
||||
func (p *DiscordClient) Close() error {
|
||||
if p.connected == false {
|
||||
return nil
|
||||
}
|
||||
return p.Session.Close()
|
||||
}
|
||||
|
||||
// GetGuildOwner -
|
||||
func (p *DiscordClient) GetGuildOwner(guild string) (ownerID string, err error) {
|
||||
if len(ownerID) == 0 {
|
||||
return "", ErrGuildIDEmpty
|
||||
}
|
||||
guildInfo, err := p.Session.Guild(guild)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
ownerID = guildInfo.OwnerID
|
||||
return
|
||||
}
|
||||
|
||||
// GuildRole -
|
||||
type GuildRole struct {
|
||||
Name string
|
||||
ID string
|
||||
}
|
||||
|
||||
// GetGuildRoles -
|
||||
func (p *DiscordClient) GetGuildRoles(guild string) (roles []GuildRole, err error) {
|
||||
if len(guild) == 0 {
|
||||
return nil, ErrGuildIDEmpty
|
||||
}
|
||||
|
||||
roleInfos, err := p.Session.GuildRoles(guild)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
roles = make([]GuildRole, 0, len(roleInfos))
|
||||
for _, role := range roleInfos {
|
||||
r := GuildRole{
|
||||
ID: role.ID,
|
||||
Name: role.Name,
|
||||
}
|
||||
roles = append(roles, r)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// SendMessage -
|
||||
func (p *DiscordClient) SendMessage() error {
|
||||
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
package discord
|
||||
|
||||
import (
|
||||
"log"
|
||||
|
||||
"github.com/bwmarrin/discordgo"
|
||||
)
|
||||
|
||||
func messageCreateEvt(s *discordgo.Session, evt *discordgo.MessageCreate) {
|
||||
guildID := evt.GuildID
|
||||
channelID := evt.ChannelID
|
||||
uid := evt.Author.ID
|
||||
_ = channelID
|
||||
_ = uid
|
||||
|
||||
ginfo, err := s.GuildRoles(guildID)
|
||||
// log.Println("get user info :: ", guildID, uid, evt.Author.Username)
|
||||
// uinfo, err := s.GuildMember(guildID, uid)
|
||||
if err != nil {
|
||||
log.Println(err)
|
||||
return
|
||||
}
|
||||
// log.Println(uinfo.Roles)
|
||||
for _, it := range ginfo {
|
||||
log.Println(":: role :: ", it.ID, it.Name)
|
||||
}
|
||||
}
|
||||
|
||||
func guildMemberAddEvt(s *discordgo.Session, evt *discordgo.GuildMemberAdd) {}
|
||||
|
||||
func guildMemberRemoveEvt(s *discordgo.Session, evt *discordgo.GuildMemberRemove) {}
|
||||
|
||||
func rateLimitEvt(s *discordgo.Session, evt *discordgo.RateLimit) {}
|
||||
|
||||
func connectEvt(s *discordgo.Session, evt *discordgo.Connect) {
|
||||
log.Println(":: Connect ::")
|
||||
client.connected = true
|
||||
}
|
||||
|
||||
func disconnectEvt(s *discordgo.Session, evt *discordgo.Disconnect) {
|
||||
log.Println(":: Disconnect ::")
|
||||
client.connected = false
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
package discord
|
||||
|
||||
import (
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
var tagRagexp = regexp.MustCompile("<@([0-9]+)>")
|
||||
|
||||
func getTagBot(msg string) bool {
|
||||
ids := tagRagexp.FindAllString(msg, -1)
|
||||
if len(ids) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, id := range ids {
|
||||
if id == client.ID {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
func getCMD(str string) (cmd string, keyword bool) {
|
||||
cmd = ""
|
||||
keyword = false
|
||||
charNumber := []rune(str)[0]
|
||||
if charNumber == 33 || charNumber == 65218 {
|
||||
keyword = true
|
||||
if charNumber == 65218 {
|
||||
cmd = str[3:]
|
||||
} else {
|
||||
cmd = str[1:]
|
||||
}
|
||||
} else {
|
||||
cmd = str
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func parseTextMessage(msg string) (cmd string, keyword bool, payload string) {
|
||||
tagBot := getTagBot(msg)
|
||||
_ = tagBot
|
||||
msg = strings.TrimSpace(tagRagexp.ReplaceAllString(msg, ""))
|
||||
|
||||
strs := strings.Split(msg, " ")
|
||||
|
||||
cmd, keyword = getCMD(strs[0])
|
||||
|
||||
payload = strings.Join(strs[1:], " ")
|
||||
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user