From 80a343e4ee06ca9f061a5bc5e3aabd06dfe69f04 Mon Sep 17 00:00:00 2001 From: Cynthia Foxwell Date: Mon, 10 Jul 2023 22:35:15 -0600 Subject: [PATCH] list guilds --- README.md | 4 ++-- commands/guild.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++ commands/main.go | 5 +++++ events/ready.go | 3 +++ 4 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 commands/guild.go diff --git a/README.md b/README.md index f145b1a..03e2353 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Go is more portable than Node.js - [ ] Switch guilds (G) - [ ] Switch channels (g) - [ ] List online users in guild (w) - - [ ] Emote (e) + - [x] Emote (e) - Just sends message surrounded in `*`'s - [ ] Finger (f) - Shows presence data if available @@ -28,7 +28,7 @@ Go is more portable than Node.js - [ ] Peek (p) - [ ] Cross-guild peek (P) - [ ] List channels (l) - - [ ] List guilds (L) + - [x] List guilds (L) - [x] Clear (c) - [ ] Surf channels forwards (>) - [ ] Surf channels backwards (<) diff --git a/commands/guild.go b/commands/guild.go new file mode 100644 index 0000000..1ec1d17 --- /dev/null +++ b/commands/guild.go @@ -0,0 +1,52 @@ +package commands + +import ( + "fmt" + "strings" + "unicode/utf8" + + "github.com/bwmarrin/discordgo" +) + +type GuildListing struct { + Name string + Members int + Online int +} + +func ListGuildsCommand(session *discordgo.Session) { + longest := 0 + guilds := make([]GuildListing, 0) + + for _, guild := range session.State.Guilds { + length := utf8.RuneCountInString(guild.Name) + if length > longest { + longest = length + } + + guildWithCounts, err := session.GuildWithCounts(guild.ID) + if err != nil { + guilds = append(guilds, GuildListing{ + Name: guild.Name, + Members: guild.MemberCount, + Online: 0, + }) + return + } + + guilds = append(guilds, GuildListing{ + Name: guild.Name, + Members: guildWithCounts.ApproximateMemberCount, + Online: guildWithCounts.ApproximatePresenceCount, + }) + } + + fmt.Print("\n\r") + fmt.Printf(" %*s online total\n\r", longest, "guild-name") + fmt.Print(strings.Repeat("-", 80) + "\n\r") + for _, guild := range guilds { + fmt.Printf(" %*s %6d %5d\n\r", longest, guild.Name, guild.Online, guild.Members) + } + fmt.Print(strings.Repeat("-", 80) + "\n\r") + fmt.Print("\n\r") +} diff --git a/commands/main.go b/commands/main.go index ae9510f..bb7e524 100644 --- a/commands/main.go +++ b/commands/main.go @@ -31,6 +31,11 @@ func Setup() { Run: EmoteCommand, Description: "emote", } + + commandMap["L"] = Command{ + Run: ListGuildsCommand, + Description: "list guilds", + } } func GetCommand(key string) (Command, bool) { diff --git a/events/ready.go b/events/ready.go index 911c8d9..42380bb 100644 --- a/events/ready.go +++ b/events/ready.go @@ -4,6 +4,7 @@ import ( "fmt" "unicode/utf8" + "github.com/Cynosphere/comcord/commands" "github.com/Cynosphere/comcord/state" "github.com/bwmarrin/discordgo" "github.com/mgutz/ansi" @@ -14,6 +15,8 @@ func Ready(session *discordgo.Session, event *discordgo.Ready) { state.SetNameLength(utf8.RuneCountInString(session.State.User.Username) + 2) + commands.ListGuildsCommand(session) + defaultGuild := state.GetConfigValue("defaultGuild") defaultChannel := state.GetConfigValue("defaultChannel") if defaultGuild != "" {