Compare commits

...
12 Commits
Author SHA1 Message Date
Dustin Pianalto e19f987c4e add request command
CI / build (push) Has been cancelled
2021-01-24 22:57:55 -09:00
Dustin Pianalto 552664268b use custom prefixes
CI / build (push) Has been cancelled
2021-01-24 01:11:22 -09:00
Dustin Pianalto 414757188e remove duplicate prefixes
CI / build (push) Has been cancelled
2021-01-24 01:05:16 -09:00
Dustin Pianalto 888d356b67 debug removing prefix
CI / build (push) Has been cancelled
2021-01-24 00:57:00 -09:00
Dustin Pianalto c776b25899 debug removing prefix
CI / build (push) Has been cancelled
2021-01-24 00:53:04 -09:00
Dustin Pianalto 81f6e23487 Fix array in guild service
CI / build (push) Has been cancelled
2021-01-24 00:46:41 -09:00
Dustin Pianalto 6cf574b22d Add prefix commands
CI / build (push) Has been cancelled
2021-01-24 00:40:02 -09:00
Dustin Pianalto 623df1d55a Add prefix commands
CI / build (push) Has been cancelled
2021-01-24 00:26:34 -09:00
Dustin Pianalto 489d96594c Add prefix commands
CI / build (push) Has been cancelled
2021-01-24 00:24:07 -09:00
Dustin Pianalto 580eea3dfa Fix nullability of columns 2021-01-23 20:10:48 -09:00
Dustin Pianalto 7a8e7bf213 use nullable string in user
CI / build (push) Has been cancelled
2021-01-23 16:05:02 -09:00
Dustin Pianalto 96e8388562 fix bug in user database
CI / build (push) Has been cancelled
2021-01-23 15:10:04 -09:00
23 changed files with 426 additions and 44 deletions
+1
View File
@@ -14,4 +14,5 @@ type ChannelService interface {
DeleteChannel(c Channel) error DeleteChannel(c Channel) error
GuildChannels(g Guild) ([]Channel, error) GuildChannels(g Guild) ([]Channel, error)
UpdateChannel(c Channel) (Channel, error) UpdateChannel(c Channel) (Channel, error)
GetOrCreateChannel(id string, guild_id string) (Channel, error)
} }
+5 -1
View File
@@ -72,7 +72,11 @@ func main() {
} }
func getPrefixes(guildID string) []string { func getPrefixes(guildID string) []string {
return []string{"G.", "g."} guild, err := services.GuildService.Guild(guildID)
if err != nil || len(guild.Prefixes) == 0 {
return []string{"G$", "g$"}
}
return guild.Prefixes
} }
func ErrorHandler(ErrorChan chan disgoman.CommandError) { func ErrorHandler(ErrorChan chan disgoman.CommandError) {
+1
View File
@@ -9,4 +9,5 @@ require (
github.com/golang-migrate/migrate v3.5.4+incompatible // indirect github.com/golang-migrate/migrate v3.5.4+incompatible // indirect
github.com/golang-migrate/migrate/v4 v4.14.1 github.com/golang-migrate/migrate/v4 v4.14.1
github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/lib/pq v1.8.0
) )
+4 -1
View File
@@ -1,8 +1,10 @@
package geeksbot package geeksbot
import "database/sql"
type Guild struct { type Guild struct {
ID string ID string
NewPatronMessage string NewPatronMessage sql.NullString
Prefixes []string Prefixes []string
} }
@@ -22,4 +24,5 @@ type GuildService interface {
Role(id string) (Role, error) Role(id string) (Role, error)
UpdateRole(r Role) (Role, error) UpdateRole(r Role) (Role, error)
DeleteRole(r Role) error DeleteRole(r Role) error
GetOrCreateGuild(id string) (Guild, error)
} }
+18
View File
@@ -66,3 +66,21 @@ func (s channelService) GuildChannels(g geeksbot.Guild) ([]geeksbot.Channel, err
} }
return channels, nil return channels, nil
} }
func (s channelService) GetOrCreateChannel(id string, guild_id string) (geeksbot.Channel, error) {
channel, err := s.Channel(id)
if err == sql.ErrNoRows {
guild, err := GuildService.GetOrCreateGuild(guild_id)
if err != nil {
return geeksbot.Channel{}, err
}
channel, err = s.CreateChannel(geeksbot.Channel{
ID: id,
Guild: guild,
Admin: false,
Default: false,
NewPatron: false,
})
}
return channel, err
}
+2 -1
View File
@@ -27,7 +27,8 @@ func ConnectDatabase(dbConnString string) {
func(name string) ([]byte, error) { func(name string) ([]byte, error) {
return migrations.Asset(name) return migrations.Asset(name)
}) })
db, err := sql.Open("postgres", dbConnString) var err error
db, err = sql.Open("postgres", dbConnString)
if err != nil { if err != nil {
log.Fatal(fmt.Errorf("Can't connect to the database: %w", err)) log.Fatal(fmt.Errorf("Can't connect to the database: %w", err))
} }
+16 -3
View File
@@ -5,6 +5,7 @@ import (
"log" "log"
"github.com/dustinpianalto/geeksbot" "github.com/dustinpianalto/geeksbot"
"github.com/lib/pq"
) )
type guildService struct { type guildService struct {
@@ -15,7 +16,7 @@ func (s guildService) Guild(id string) (geeksbot.Guild, error) {
var g geeksbot.Guild var g geeksbot.Guild
queryString := "SELECT id, new_patron_message, prefixes FROM guilds WHERE id = $1" queryString := "SELECT id, new_patron_message, prefixes FROM guilds WHERE id = $1"
row := s.db.QueryRow(queryString, id) row := s.db.QueryRow(queryString, id)
err := row.Scan(&g.ID, &g.NewPatronMessage, &g.Prefixes) err := row.Scan(&g.ID, &g.NewPatronMessage, pq.Array(&g.Prefixes))
if err != nil { if err != nil {
return geeksbot.Guild{}, err return geeksbot.Guild{}, err
} }
@@ -24,7 +25,7 @@ func (s guildService) Guild(id string) (geeksbot.Guild, error) {
func (s guildService) CreateGuild(g geeksbot.Guild) (geeksbot.Guild, error) { func (s guildService) CreateGuild(g geeksbot.Guild) (geeksbot.Guild, error) {
queryString := "INSERT INTO guilds (id, new_patron_message, prefixes) VALUES ($1, $2, $3)" queryString := "INSERT INTO guilds (id, new_patron_message, prefixes) VALUES ($1, $2, $3)"
_, err := s.db.Exec(queryString, g.ID, g.NewPatronMessage, g.Prefixes) _, err := s.db.Exec(queryString, g.ID, g.NewPatronMessage, pq.Array(g.Prefixes))
return g, err return g, err
} }
@@ -36,7 +37,7 @@ func (s guildService) DeleteGuild(g geeksbot.Guild) error {
func (s guildService) UpdateGuild(g geeksbot.Guild) (geeksbot.Guild, error) { func (s guildService) UpdateGuild(g geeksbot.Guild) (geeksbot.Guild, error) {
queryString := "UPDATE guilds SET new_patron_message = $2, prefixes = $3 WHERE id = $1" queryString := "UPDATE guilds SET new_patron_message = $2, prefixes = $3 WHERE id = $1"
_, err := s.db.Exec(queryString, g.ID, g.NewPatronMessage, g.Prefixes) _, err := s.db.Exec(queryString, g.ID, g.NewPatronMessage, pq.Array(g.Prefixes))
return g, err return g, err
} }
@@ -98,3 +99,15 @@ func (s guildService) DeleteRole(r geeksbot.Role) error {
_, err := s.db.Exec(queryString, r.ID) _, err := s.db.Exec(queryString, r.ID)
return err return err
} }
func (s guildService) GetOrCreateGuild(id string) (geeksbot.Guild, error) {
guild, err := s.Guild(id)
if err == sql.ErrNoRows {
guild = geeksbot.Guild{
ID: id,
Prefixes: []string{},
}
guild, err = s.CreateGuild(guild)
}
return guild, err
}
@@ -0,0 +1,48 @@
BEGIN;
ALTER TABLE users
ALTER COLUMN active DROP NOT NULL,
ALTER COLUMN staff DROP NOT NULL,
ALTER COLUMN admin DROP NOT NULL;
ALTER TABLE channels
ALTER COLUMN guild_id DROP NOT NULL,
ALTER COLUMN admin DROP NOT NULL,
ALTER COLUMN default_channel DROP NOT NULL,
ALTER COLUMN new_patron DROP NOT NULL;
ALTER TABLE messages
ALTER COLUMN created_at DROP NOT NULL,
ALTER COLUMN content DROP NOT NULL,
ALTER COLUMN channel_id DROP NOT NULL,
ALTER COLUMN author_id DROP NOT NULL;
ALTER TABLE messages
ADD COLUMN embed json,
ADD COLUMN previous_embeds json[];
ALTER TABLE patreon_creators
ALTER COLUMN creator DROP NOT NULL,
ALTER COLUMN link DROP NOT NULL,
ALTER COLUMN guild_id DROP NOT NULL;
ALTER TABLE patreon_creators
RENAME TO patreon_creator;
ALTER TABLE patreon_tiers
ALTER COLUMN name DROP NOT NULL,
ALTER COLUMN creator DROP NOT NULL,
ALTER COLUMN role DROP NOT NULL;
ALTER TABLE patreon_tiers
RENAME TO patreon_tier;
ALTER TABLE requests
ALTER COLUMN author_id DROP NOT NULL,
ALTER COLUMN channel_id DROP NOT NULL,
ALTER COLUMN content DROP NOT NULL,
ALTER COLUMN requested_at DROP NOT NULL,
ALTER COLUMN completed DROP NOT NULL,
ALTER COLUMN message_id DROP NOT NULL,
ALTER COLUMN guild_id DROP NOT NULL;
ALTER TABLE roles
ALTER COLUMN role_type DROP NOT NULL,
ALTER COLUMN guild_id DROP NOT NULL;
ALTER TABLE servers
ALTER COLUMN name DROP NOT NULL,
ALTER COLUMN ip_address DROP NOT NULL,
ALTER COLUMN port DROP NOT NULL,
ALTER COLUMN password DROP NOT NULL,
ALTER COLUMN guild_id DROP NOT NULL;
COMMIT;
@@ -0,0 +1,48 @@
BEGIN;
ALTER TABLE users
ALTER COLUMN active SET NOT NULL,
ALTER COLUMN staff SET NOT NULL,
ALTER COLUMN admin SET NOT NULL;
ALTER TABLE channels
ALTER COLUMN guild_id SET NOT NULL,
ALTER COLUMN admin SET NOT NULL,
ALTER COLUMN default_channel SET NOT NULL,
ALTER COLUMN new_patron SET NOT NULL;
ALTER TABLE messages
ALTER COLUMN created_at SET NOT NULL,
ALTER COLUMN content SET NOT NULL,
ALTER COLUMN channel_id SET NOT NULL,
ALTER COLUMN author_id SET NOT NULL;
ALTER TABLE messages
DROP COLUMN embed,
DROP COLUMN previous_embeds;
ALTER TABLE patreon_creator
ALTER COLUMN creator SET NOT NULL,
ALTER COLUMN link SET NOT NULL,
ALTER COLUMN guild_id SET NOT NULL;
ALTER TABLE patreon_creator
RENAME TO patreon_creators;
ALTER TABLE patreon_tier
ALTER COLUMN name SET NOT NULL,
ALTER COLUMN creator SET NOT NULL,
ALTER COLUMN role SET NOT NULL;
ALTER TABLE patreon_tier
RENAME TO patreon_tiers;
ALTER TABLE requests
ALTER COLUMN author_id SET NOT NULL,
ALTER COLUMN channel_id SET NOT NULL,
ALTER COLUMN content SET NOT NULL,
ALTER COLUMN requested_at SET NOT NULL,
ALTER COLUMN completed SET NOT NULL,
ALTER COLUMN message_id SET NOT NULL,
ALTER COLUMN guild_id SET NOT NULL;
ALTER TABLE roles
ALTER COLUMN role_type SET NOT NULL,
ALTER COLUMN guild_id SET NOT NULL;
ALTER TABLE servers
ALTER COLUMN name SET NOT NULL,
ALTER COLUMN ip_address SET NOT NULL,
ALTER COLUMN port SET NOT NULL,
ALTER COLUMN password SET NOT NULL,
ALTER COLUMN guild_id SET NOT NULL;
COMMIT;
+9 -5
View File
@@ -16,7 +16,7 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) {
var aID string var aID string
var cID string var cID string
var gID string var gID string
var uID string var uID sql.NullString
var mID string var mID string
queryString := `SELECT id, author_id, channel_id, guild_id, content, requested_at, completed, queryString := `SELECT id, author_id, channel_id, guild_id, content, requested_at, completed,
completed_at, completed_by, message_id, completed_message completed_at, completed_by, message_id, completed_message
@@ -39,9 +39,14 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) {
if err != nil { if err != nil {
return geeksbot.Request{}, err return geeksbot.Request{}, err
} }
completedBy, err := UserService.User(uID) if !uID.Valid {
if err != nil { r.CompletedBy = nil
return geeksbot.Request{}, err } else {
completedBy, err := UserService.User(uID.String)
if err != nil {
return geeksbot.Request{}, err
}
r.CompletedBy = &completedBy
} }
message, err := MessageService.Message(mID) message, err := MessageService.Message(mID)
if err != nil { if err != nil {
@@ -50,7 +55,6 @@ func (s requestService) Request(id int64) (geeksbot.Request, error) {
r.Author = author r.Author = author
r.Guild = guild r.Guild = guild
r.Channel = channel r.Channel = channel
r.CompletedBy = completedBy
r.Message = message r.Message = message
return r, nil return r, nil
} }
+36 -20
View File
@@ -14,10 +14,10 @@ type serverService struct {
func (s serverService) ServerByID(id int) (geeksbot.Server, error) { func (s serverService) ServerByID(id int) (geeksbot.Server, error) {
var server geeksbot.Server var server geeksbot.Server
var guildID string var guildID string
var aChanID string var aChanID sql.NullString
var iChanID string var iChanID sql.NullString
var iMsgID string var iMsgID sql.NullString
var sMsgID string var sMsgID sql.NullString
queryString := `SELECT id, name, ip_address, port, password, alerts_channel_id, queryString := `SELECT id, name, ip_address, port, password, alerts_channel_id,
guild_id, info_channel_id, info_message_id, settings_message_id guild_id, info_channel_id, info_message_id, settings_message_id
FROM servers WHERE id = $1` FROM servers WHERE id = $1`
@@ -31,27 +31,43 @@ func (s serverService) ServerByID(id int) (geeksbot.Server, error) {
if err != nil { if err != nil {
return geeksbot.Server{}, err return geeksbot.Server{}, err
} }
alertChannel, err := ChannelService.Channel(aChanID) if !aChanID.Valid {
if err != nil { server.AlertsChannel = nil
return geeksbot.Server{}, err } else {
alertChannel, err := ChannelService.Channel(aChanID.String)
if err != nil {
return geeksbot.Server{}, err
}
server.AlertsChannel = &alertChannel
} }
infoChannel, err := ChannelService.Channel(iChanID) if !iChanID.Valid {
if err != nil { server.InfoChannel = nil
return geeksbot.Server{}, err } else {
infoChannel, err := ChannelService.Channel(iChanID.String)
if err != nil {
return geeksbot.Server{}, err
}
server.InfoChannel = &infoChannel
} }
infoMessage, err := MessageService.Message(iMsgID) if !iMsgID.Valid {
if err != nil { server.InfoMessage = nil
return geeksbot.Server{}, err } else {
infoMessage, err := MessageService.Message(iMsgID.String)
if err != nil {
return geeksbot.Server{}, err
}
server.InfoMessage = &infoMessage
} }
settingsMessage, err := MessageService.Message(sMsgID) if !sMsgID.Valid {
if err != nil { server.SettingsMessage = nil
return geeksbot.Server{}, err } else {
settingsMessage, err := MessageService.Message(sMsgID.String)
if err != nil {
return geeksbot.Server{}, err
}
server.SettingsMessage = &settingsMessage
} }
server.Guild = guild server.Guild = guild
server.AlertsChannel = alertChannel
server.InfoChannel = infoChannel
server.InfoMessage = infoMessage
server.SettingsMessage = settingsMessage
return server, nil return server, nil
} }
+13
View File
@@ -36,3 +36,16 @@ func (s userService) UpdateUser(u geeksbot.User) (geeksbot.User, error) {
_, err := s.db.Exec(queryString, u.ID, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin) _, err := s.db.Exec(queryString, u.ID, u.SteamID, u.IsActive, u.IsStaff, u.IsAdmin)
return u, err return u, err
} }
func (s userService) GetOrCreateUser(id string) (geeksbot.User, error) {
user, err := s.User(id)
if err == sql.ErrNoRows {
user, err = s.CreateUser(geeksbot.User{
ID: id,
IsActive: true,
IsAdmin: false,
IsStaff: false,
})
}
return user, err
}
+11
View File
@@ -0,0 +1,11 @@
package discord_utils
import "github.com/dustinpianalto/disgoman"
func SendErrorMessage(ctx disgoman.Context, msg string, err error) {
ctx.CommandManager.ErrorChannel <- disgoman.CommandError{
Context: ctx,
Message: msg,
Error: err,
}
}
+109
View File
@@ -0,0 +1,109 @@
package guild
import (
"fmt"
"github.com/dustinpianalto/disgoman"
"github.com/dustinpianalto/geeksbot"
"github.com/dustinpianalto/geeksbot/internal/discord_utils"
"github.com/dustinpianalto/geeksbot/internal/services"
"github.com/dustinpianalto/geeksbot/internal/utils"
)
var AddPrefixCommand = &disgoman.Command{
Name: "addPrefix",
Aliases: []string{"ap"},
Description: "Add a prefix for use in this guild.",
OwnerOnly: false,
Hidden: false,
RequiredPermissions: disgoman.PermissionManageServer,
Invoke: addPrefixCommandFunc,
}
func addPrefixCommandFunc(ctx disgoman.Context, args []string) {
if len(args) == 0 {
discord_utils.SendErrorMessage(ctx, "Please include at least one prefix to add", nil)
return
}
guild, err := services.GuildService.Guild(ctx.Guild.ID)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Guild not configured, adding new guild to the database", nil)
guild = geeksbot.Guild{
ID: ctx.Guild.ID,
Prefixes: args,
}
guild, err = services.GuildService.CreateGuild(guild)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error adding guild to database.", err)
return
}
} else {
guild.Prefixes = append(guild.Prefixes, args...)
guild.Prefixes = utils.RemoveDuplicateStrings(guild.Prefixes)
guild, err = services.GuildService.UpdateGuild(guild)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error adding prefixes to guild.", err)
return
}
}
_, err = ctx.Send(fmt.Sprintf("Prefixes Updates.\nThe Prefixes for this guild are currently %#v", guild.Prefixes))
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error sending update message", err)
}
}
var RemovePrefixCommand = &disgoman.Command{
Name: "removePrefix",
Aliases: []string{"rp"},
Description: "Remove a prefix so it can't be used in this guild",
OwnerOnly: false,
Hidden: false,
RequiredPermissions: disgoman.PermissionManageServer,
Invoke: removePrefixCommandFunc,
}
func removePrefixCommandFunc(ctx disgoman.Context, args []string) {
if len(args) == 0 {
discord_utils.SendErrorMessage(ctx, "Please include at least one prefix to remove", nil)
return
}
guild, err := services.GuildService.Guild(ctx.Guild.ID)
var removed []string
if err != nil {
discord_utils.SendErrorMessage(ctx, "Guild not configured, adding new guild to the database", nil)
guild = geeksbot.Guild{
ID: ctx.Guild.ID,
Prefixes: []string{},
}
guild, err = services.GuildService.CreateGuild(guild)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error adding guild to database.", err)
return
}
} else {
for _, a := range args {
l := len(guild.Prefixes)
for i := 0; i < l; i++ {
if a == guild.Prefixes[i] {
guild.Prefixes = append(guild.Prefixes[:i], guild.Prefixes[i+1:]...)
l--
i--
removed = append(removed, a)
}
}
}
removed = utils.RemoveDuplicateStrings(removed)
guild.Prefixes = utils.RemoveDuplicateStrings(guild.Prefixes)
guild, err = services.GuildService.UpdateGuild(guild)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error removing prefixes from guild.", err)
return
}
}
_, err = ctx.Send(fmt.Sprintf("Prefixes Updates.\n"+
"The Prefixes for this guild are currently %#v\n"+
"Removed: %#v", guild.Prefixes, removed))
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error sending update message", err)
}
}
+3
View File
@@ -2,6 +2,7 @@ package exts
import ( import (
"github.com/dustinpianalto/disgoman" "github.com/dustinpianalto/disgoman"
"github.com/dustinpianalto/geeksbot/internal/exts/guild"
"github.com/dustinpianalto/geeksbot/internal/exts/utils" "github.com/dustinpianalto/geeksbot/internal/exts/utils"
) )
@@ -20,4 +21,6 @@ func AddCommandHandlers(g *disgoman.CommandManager) {
_ = g.AddCommand(utils.GitCommand) _ = g.AddCommand(utils.GitCommand)
_ = g.AddCommand(utils.InviteCommand) _ = g.AddCommand(utils.InviteCommand)
_ = g.AddCommand(utils.PingCommand) _ = g.AddCommand(utils.PingCommand)
_ = g.AddCommand(guild.AddPrefixCommand)
_ = g.AddCommand(guild.RemovePrefixCommand)
} }
+63
View File
@@ -0,0 +1,63 @@
package requests
import (
"strconv"
"strings"
"github.com/dustinpianalto/disgoman"
"github.com/dustinpianalto/geeksbot"
"github.com/dustinpianalto/geeksbot/internal/discord_utils"
"github.com/dustinpianalto/geeksbot/internal/services"
)
var RequestCommand = &disgoman.Command{
Name: "request",
Aliases: nil,
Description: "Submit a request for the guild staff",
OwnerOnly: false,
Hidden: false,
RequiredPermissions: 0,
Invoke: requestCommandFunc,
}
func requestCommandFunc(ctx disgoman.Context, args []string) {
guild, err := services.GuildService.GetOrCreateGuild(ctx.Guild.ID)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error getting Guild from the database", err)
return
}
requestMsg := strings.Join(args, " ")
author, err := services.UserService.GetOrCreateUser(ctx.Message.Author.ID)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error creating the request", err)
return
}
channel, err := services.ChannelService.GetOrCreateChannel(ctx.Message.ChannelID, ctx.Guild.ID)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error creating the request", err)
return
}
int64ID, _ := strconv.ParseInt(ctx.Message.ID, 10, 64)
s := discord_utils.ParseSnowflake(int64ID)
message, err := services.MessageService.CreateMessage(geeksbot.Message{
ID: ctx.Message.ID,
CreatedAt: s.CreationTime,
Content: ctx.Message.Content,
Channel: channel,
Author: author,
})
request := geeksbot.Request{
Author: author,
Channel: channel,
Guild: guild,
Content: requestMsg,
RequestedAt: s.CreationTime,
Completed: false,
Message: message,
}
request, err = services.RequestService.CreateRequest(request)
if err != nil {
discord_utils.SendErrorMessage(ctx, "Error creating the request", err)
return
}
}
-1
View File
@@ -263,7 +263,6 @@ func addUserCommandFunc(ctx disgoman.Context, args []string) {
if ctx.Message.Author.ID == ctx.CommandManager.Owners[0] { if ctx.Message.Author.ID == ctx.CommandManager.Owners[0] {
user := geeksbot.User{ user := geeksbot.User{
ID: ctx.Message.Author.ID, ID: ctx.Message.Author.ID,
SteamID: "",
IsActive: true, IsActive: true,
IsStaff: true, IsStaff: true,
IsAdmin: true, IsAdmin: true,
+14
View File
@@ -0,0 +1,14 @@
package utils
func RemoveDuplicateStrings(s []string) []string {
keys := make(map[string]bool)
o := []string{}
for _, e := range s {
if _, v := keys[e]; !v {
keys[e] = true
o = append(o, e)
}
}
return o
}
+7 -2
View File
@@ -1,9 +1,14 @@
package geeksbot package geeksbot
import (
"database/sql"
"time"
)
type Message struct { type Message struct {
ID string ID string
CreatedAt int64 CreatedAt time.Time
ModifiedAt int64 ModifiedAt sql.NullTime
Content string Content string
PreviousContent []string PreviousContent []string
Channel Channel Channel Channel
+3 -1
View File
@@ -1,5 +1,7 @@
package geeksbot package geeksbot
import "database/sql"
type PatreonCreator struct { type PatreonCreator struct {
ID int ID int
Creator string Creator string
@@ -10,7 +12,7 @@ type PatreonCreator struct {
type PatreonTier struct { type PatreonTier struct {
ID int ID int
Name string Name string
Description string Description sql.NullString
Creator PatreonCreator Creator PatreonCreator
Role Role Role Role
NextTier *PatreonTier NextTier *PatreonTier
+7 -4
View File
@@ -1,6 +1,9 @@
package geeksbot package geeksbot
import "time" import (
"database/sql"
"time"
)
type Request struct { type Request struct {
ID int64 ID int64
@@ -10,10 +13,10 @@ type Request struct {
Content string Content string
RequestedAt time.Time RequestedAt time.Time
Completed bool Completed bool
CompletedAt time.Time CompletedAt sql.NullTime
CompletedBy User CompletedBy *User
Message Message Message Message
CompletedMessage string CompletedMessage sql.NullString
} }
type Comment struct { type Comment struct {
+4 -4
View File
@@ -6,11 +6,11 @@ type Server struct {
IPAddr string IPAddr string
Port int Port int
Password string Password string
AlertsChannel Channel AlertsChannel *Channel
Guild Guild Guild Guild
InfoChannel Channel InfoChannel *Channel
InfoMessage Message InfoMessage *Message
SettingsMessage Message SettingsMessage *Message
} }
type ServerService interface { type ServerService interface {
+4 -1
View File
@@ -1,8 +1,10 @@
package geeksbot package geeksbot
import "database/sql"
type User struct { type User struct {
ID string ID string
SteamID string SteamID sql.NullString
IsActive bool IsActive bool
IsStaff bool IsStaff bool
IsAdmin bool IsAdmin bool
@@ -13,4 +15,5 @@ type UserService interface {
CreateUser(u User) (User, error) CreateUser(u User) (User, error)
DeleteUser(u User) error DeleteUser(u User) error
UpdateUser(u User) (User, error) UpdateUser(u User) (User, error)
GetOrCreateUser(id string) (User, error)
} }