| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- package ui
- import (
- "context"
- "fmt"
- "runtime"
- "strings"
- "github.com/ayntgl/discordo/config"
- "github.com/diamondburned/arikawa/v3/api"
- "github.com/diamondburned/arikawa/v3/discord"
- "github.com/diamondburned/arikawa/v3/gateway"
- "github.com/diamondburned/arikawa/v3/state"
- "github.com/rivo/tview"
- )
- func init() {
- api.UserAgent = fmt.Sprintf("%s/%s %s/%s", config.Name, "0.1", "arikawa", "v3")
- gateway.DefaultIdentity = gateway.IdentifyProperties{
- OS: runtime.GOOS,
- Browser: config.Name,
- }
- }
- type State struct {
- *state.State
- core *Core
- }
- func NewState(token string, c *Core) *State {
- return &State{
- State: state.New(token),
- core: c,
- }
- }
- func (s *State) Run() error {
- // Add the essential intents to the identify data for bot accounts.
- if strings.HasPrefix(s.Token, "Bot") {
- s.AddIntents(gateway.IntentGuilds | gateway.IntentGuildMessages)
- }
- s.AddHandler(s.ready)
- s.AddHandler(s.guildCreate)
- s.AddHandler(s.guildDelete)
- s.AddHandler(s.messageCreate)
- return s.Open(context.Background())
- }
- func (s *State) ready(r *gateway.ReadyEvent) {
- rootNode := s.core.GuildsTree.GetRoot()
- for _, gf := range r.UserSettings.GuildFolders {
- if gf.ID == 0 {
- for _, gID := range gf.GuildIDs {
- g, err := s.State.Cabinet.Guild(gID)
- if err != nil {
- return
- }
- guildNode := tview.NewTreeNode(g.Name)
- guildNode.SetReference(g.ID)
- rootNode.AddChild(guildNode)
- }
- } else {
- var b strings.Builder
- if gf.Color != discord.NullColor {
- b.WriteByte('[')
- b.WriteString(gf.Color.String())
- b.WriteByte(']')
- } else {
- b.WriteString("[#ED4245]")
- }
- if gf.Name != "" {
- b.WriteString(gf.Name)
- } else {
- b.WriteString("Folder")
- }
- b.WriteString("[-]")
- folderNode := tview.NewTreeNode(b.String())
- rootNode.AddChild(folderNode)
- for _, gID := range gf.GuildIDs {
- g, err := s.State.Cabinet.Guild(gID)
- if err != nil {
- return
- }
- guildNode := tview.NewTreeNode(g.Name)
- guildNode.SetReference(g.ID)
- folderNode.AddChild(guildNode)
- }
- }
- }
- s.core.GuildsTree.SetCurrentNode(rootNode)
- s.core.Application.SetFocus(s.core.GuildsTree)
- }
- func (s *State) guildCreate(g *gateway.GuildCreateEvent) {
- guildNode := tview.NewTreeNode(g.Name)
- guildNode.SetReference(g.ID)
- rootNode := s.core.GuildsTree.GetRoot()
- rootNode.AddChild(guildNode)
- s.core.GuildsTree.SetCurrentNode(rootNode)
- s.core.Application.SetFocus(s.core.GuildsTree)
- s.core.Application.Draw()
- }
- func (s *State) guildDelete(g *gateway.GuildDeleteEvent) {
- rootNode := s.core.GuildsTree.GetRoot()
- var parentNode *tview.TreeNode
- rootNode.Walk(func(node, _ *tview.TreeNode) bool {
- if node.GetReference() == g.ID {
- parentNode = node
- return false
- }
- return true
- })
- if parentNode != nil {
- rootNode.RemoveChild(parentNode)
- }
- s.core.Application.Draw()
- }
- func (s *State) messageCreate(m *gateway.MessageCreateEvent) {
- if s.core.ChannelsTree.SelectedChannel != nil && s.core.ChannelsTree.SelectedChannel.ID == m.ChannelID {
- _, err := s.core.MessagesPanel.Write(buildMessage(s.core, m.Message))
- if err != nil {
- return
- }
- if len(s.core.MessagesPanel.GetHighlights()) == 0 {
- s.core.MessagesPanel.ScrollToEnd()
- }
- }
- }
|