add new bot code

This commit is contained in:
Jay
2019-06-28 09:37:37 +00:00
commit 0b636319b3
9 changed files with 457 additions and 0 deletions
+80
View File
@@ -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
}
+28
View File
@@ -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()
}
+116
View File
@@ -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
}
+43
View File
@@ -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
}
+55
View File
@@ -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
}