From 301d7a94134e14e9919183f84fd09107094ba0aa Mon Sep 17 00:00:00 2001 From: zekro Date: Mon, 24 Dec 2018 03:41:15 +0100 Subject: [PATCH 1/3] added autorole command --- commands/cmdautorole.go | 71 +++++++++++++++++++++++++++++++++++++++++ core/database.go | 3 ++ core/mysql.go | 25 +++++++++++++++ main.go | 1 + scripts/dbScheme.sql | 15 +++++---- 5 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 commands/cmdautorole.go diff --git a/commands/cmdautorole.go b/commands/cmdautorole.go new file mode 100644 index 00000000..e8a3b99d --- /dev/null +++ b/commands/cmdautorole.go @@ -0,0 +1,71 @@ +package commands + +import ( + "fmt" + "time" + + "github.com/zekroTJA/shinpuru/core" + "github.com/zekroTJA/shinpuru/util" +) + +type CmdAutorole struct { +} + +func (c *CmdAutorole) GetInvokes() []string { + return []string{"autorole", "arole"} +} + +func (c *CmdAutorole) GetDescription() string { + return "set the autorole for the current guild" +} + +func (c *CmdAutorole) GetHelp() string { + return "`autorole` - display currently set autorole\n" + + "`autorole <`" +} + +func (c *CmdAutorole) GetGroup() string { + return GroupEtc +} + +func (c *CmdAutorole) GetPermission() int { + return 9 +} + +func (c *CmdAutorole) Exec(args *CommandArgs) error { + if len(args.Args) < 1 { + currAutoRoleID, err := args.CmdHandler.db.GetGuildAutoRole(args.Guild.ID) + if err != nil && !core.IsErrDatabaseNotFound(err) { + return err + } + if currAutoRoleID == "" { + _, err := util.SendEmbed(args.Session, args.Channel.ID, + "There is no autorole set on this guild currently.", "", 0) + return err + } + _, err = util.FetchRole(args.Session, args.Guild.ID, currAutoRoleID) + if err != nil { + _, err := util.SendEmbedError(args.Session, args.Channel.ID, + "**ATTENTION:** The set auto role is no more existent on the guild!") + return err + } + _, err = util.SendEmbed(args.Session, args.Channel.ID, + fmt.Sprintf("Currently, <@&%s> is set as auto role.", currAutoRoleID), "", 0) + return err + } + + newAutoRole, err := util.FetchRole(args.Session, args.Guild.ID, args.Args[0]) + if err != nil { + msg, err := util.SendEmbedError(args.Session, args.Channel.ID, + "Sorry, but the entered role could not be fetched :(") + util.DeleteMessageLater(args.Session, msg, 5*time.Second) + return err + } + err = args.CmdHandler.db.SetGuildAutoRole(args.Guild.ID, newAutoRole.ID) + if err != nil { + return err + } + _, err = util.SendEmbed(args.Session, args.Channel.ID, + fmt.Sprintf("Autorole set to <@&%s>.", newAutoRole.ID), "", util.ColorEmbedUpdated) + return err +} diff --git a/core/database.go b/core/database.go index a2a27680..1d781a5b 100644 --- a/core/database.go +++ b/core/database.go @@ -15,6 +15,9 @@ type Database interface { GetGuildPrefix(guildID string) (string, error) SetGuildPrefix(guildID, newPrefix string) error + GetGuildAutoRole(guildID string) (string, error) + SetGuildAutoRole(guildID, autoRoleID string) error + GetGuildPermissions(guildID string) (map[string]int, error) SetGuildRolePermission(guildID, roleID string, permLvL int) error diff --git a/core/mysql.go b/core/mysql.go index 6c5bb143..d9d4ed29 100644 --- a/core/mysql.go +++ b/core/mysql.go @@ -55,6 +55,31 @@ func (m *MySql) SetGuildPrefix(guildID, newPrefix string) error { return err } +func (m *MySql) GetGuildAutoRole(guildID string) (string, error) { + var autorole string + err := m.DB.QueryRow("SELECT autorole FROM guilds WHERE guildID = ?", guildID).Scan(&autorole) + if err == sql.ErrNoRows { + err = ErrDatabaseNotFound + } + return autorole, err +} + +func (m *MySql) SetGuildAutoRole(guildID, autoRoleID string) error { + res, err := m.DB.Exec("UPDATE guilds SET autorole = ? WHERE guildID = ?", autoRoleID, guildID) + if ar, err := res.RowsAffected(); ar == 0 { + if err != nil { + return err + } + _, err := m.DB.Exec("INSERT INTO guilds (guildID, autorole) VALUES (?, ?)", guildID, autoRoleID) + if err != nil { + return err + } + } else if err != nil { + return err + } + return err +} + func (m *MySql) GetMemberPermissionLevel(s *discordgo.Session, guildID string, memberID string) (int, error) { guildPerms, err := m.GetGuildPermissions(guildID) if err != nil { diff --git a/main.go b/main.go index 9e479775..668f2ff0 100644 --- a/main.go +++ b/main.go @@ -90,6 +90,7 @@ func main() { cmdHandler.RegisterCommand(new(commands.CmdSay)) cmdHandler.RegisterCommand(new(commands.CmdQuote)) cmdHandler.RegisterCommand(new(commands.CmdGame)) + cmdHandler.RegisterCommand(new(commands.CmdAutorole)) ////////////////////////// // BOT SESSION CREATION // diff --git a/scripts/dbScheme.sql b/scripts/dbScheme.sql index 1e16f930..051e0ebc 100644 --- a/scripts/dbScheme.sql +++ b/scripts/dbScheme.sql @@ -3,16 +3,11 @@ SET time_zone = "+00:00"; CREATE DATABASE IF NOT EXISTS `shinpuru` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; USE `shinpuru`; -DROP TABLE IF EXISTS `guildmembers`; -CREATE TABLE `guildmembers` ( - `guilduserBlob` text NOT NULL, - `permlvl` int(11) NOT NULL DEFAULT '0' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; - DROP TABLE IF EXISTS `guilds`; CREATE TABLE `guilds` ( `guildID` text NOT NULL, - `prefix` text NOT NULL + `prefix` text NOT NULL, + `autorole` text NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; DROP TABLE IF EXISTS `permissions`; @@ -21,3 +16,9 @@ CREATE TABLE `permissions` ( `guildID` text NOT NULL, `permission` int(11) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + +DROP TABLE IF EXISTS `settings`; +CREATE TABLE `settings` ( + `setting` text NOT NULL, + `value` text NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; \ No newline at end of file From 1a4a7ddd5f0ace11ec9f7f204d7a148cfc7be4c3 Mon Sep 17 00:00:00 2001 From: zekro Date: Mon, 24 Dec 2018 03:45:53 +0100 Subject: [PATCH 2/3] added cloc stuff --- cloc.md | 13 +++++++++++++ scripts/cloc.sh | 3 +++ 2 files changed, 16 insertions(+) create mode 100644 cloc.md create mode 100644 scripts/cloc.sh diff --git a/cloc.md b/cloc.md new file mode 100644 index 00000000..b2c5f625 --- /dev/null +++ b/cloc.md @@ -0,0 +1,13 @@ + +cloc|github.com/AlDanial/cloc v 1.74 T=0.50 s (72.0 files/s, 4122.0 lines/s) +--- | --- + +Language|files|blank|comment|code +:-------|-------:|-------:|-------:|-------: +Go|28|278|12|1592 +Bourne Shell|4|18|2|49 +Markdown|1|16|0|38 +YAML|2|4|0|28 +SQL|1|3|0|21 +--------|--------|--------|--------|-------- +SUM:|36|319|14|1728 diff --git a/scripts/cloc.sh b/scripts/cloc.sh new file mode 100644 index 00000000..f1c4e9d3 --- /dev/null +++ b/scripts/cloc.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +cloc . --md > ./cloc.md \ No newline at end of file From 7fa2ec0ba1d0f5ee27b025c5895c84c1a9a4512d Mon Sep 17 00:00:00 2001 From: zekro Date: Mon, 24 Dec 2018 10:43:20 +0100 Subject: [PATCH 3/3] added autorole system --- cloc.md | 6 +++--- commands/cmdautorole.go | 2 +- listeners/memberadd.go | 32 ++++++++++++++++++++++++++++++++ main.go | 1 + 4 files changed, 37 insertions(+), 4 deletions(-) create mode 100644 listeners/memberadd.go diff --git a/cloc.md b/cloc.md index b2c5f625..cdad0bb6 100644 --- a/cloc.md +++ b/cloc.md @@ -1,13 +1,13 @@ -cloc|github.com/AlDanial/cloc v 1.74 T=0.50 s (72.0 files/s, 4122.0 lines/s) +cloc|github.com/AlDanial/cloc v 1.74 T=0.50 s (74.0 files/s, 4188.0 lines/s) --- | --- Language|files|blank|comment|code :-------|-------:|-------:|-------:|-------: -Go|28|278|12|1592 +Go|29|283|12|1620 Bourne Shell|4|18|2|49 Markdown|1|16|0|38 YAML|2|4|0|28 SQL|1|3|0|21 --------|--------|--------|--------|-------- -SUM:|36|319|14|1728 +SUM:|37|324|14|1756 diff --git a/commands/cmdautorole.go b/commands/cmdautorole.go index e8a3b99d..18a936ca 100644 --- a/commands/cmdautorole.go +++ b/commands/cmdautorole.go @@ -21,7 +21,7 @@ func (c *CmdAutorole) GetDescription() string { func (c *CmdAutorole) GetHelp() string { return "`autorole` - display currently set autorole\n" + - "`autorole <`" + "`autorole ` - set an auto role for the current guild" } func (c *CmdAutorole) GetGroup() string { diff --git a/listeners/memberadd.go b/listeners/memberadd.go new file mode 100644 index 00000000..10c3d577 --- /dev/null +++ b/listeners/memberadd.go @@ -0,0 +1,32 @@ +package listeners + +import ( + "strings" + + "github.com/bwmarrin/discordgo" + "github.com/zekroTJA/shinpuru/core" + "github.com/zekroTJA/shinpuru/util" +) + +type ListenerMemberAdd struct { + db core.Database +} + +func NewListenerMemberAdd(db core.Database) *ListenerMemberAdd { + return &ListenerMemberAdd{ + db: db, + } +} + +func (l *ListenerMemberAdd) Handler(s *discordgo.Session, e *discordgo.GuildMemberAdd) { + autoRoleID, err := l.db.GetGuildAutoRole(e.GuildID) + if err != nil && !core.IsErrDatabaseNotFound(err) { + util.Log.Errorf("Failed getting autorole for guild '%s' from database: %s", e.GuildID, err.Error()) + } + err = s.GuildMemberRoleAdd(e.GuildID, e.User.ID, autoRoleID) + if err != nil && strings.Contains(err.Error(), `{"code": 10011, "message": "Unknown Role"}`) { + l.db.SetGuildAutoRole(e.GuildID, "") + } else if err != nil { + util.Log.Errorf("Failed setting autorole for member '%s': %s", e.User.ID, err.Error()) + } +} diff --git a/main.go b/main.go index 668f2ff0..98e3227d 100644 --- a/main.go +++ b/main.go @@ -104,6 +104,7 @@ func main() { session.AddHandler(listeners.NewListenerReady(config, database).Handler) session.AddHandler(listeners.NewListenerCmd(config, database, cmdHandler).Handler) session.AddHandler(listeners.NewListenerGuildJoin(config).Handler) + session.AddHandler(listeners.NewListenerMemberAdd(database).Handler) err = session.Open() if err != nil {