1 Commits

Author SHA1 Message Date
d09e3fce03 WIP push 2026-01-26 22:27:25 -05:00
5 changed files with 66 additions and 40 deletions

1
.gitignore vendored
View File

@@ -25,4 +25,3 @@ go.work.sum
# env file # env file
.env .env
/cmd/*

31
bolt.go
View File

@@ -10,6 +10,7 @@ import (
"syscall" "syscall"
"time" "time"
"code.jakeyoungdev.com/go/lite"
dg "github.com/bwmarrin/discordgo" dg "github.com/bwmarrin/discordgo"
) )
@@ -22,19 +23,31 @@ const (
dg.IntentMessageContent | dg.IntentMessageContent |
dg.IntentsGuildMessages | dg.IntentsGuildMessages |
dg.IntentGuildMessageReactions dg.IntentGuildMessageReactions
DEFAULT_DB_NAME = "boltdb"
DB_PATH = "/var/lib/bolt"
) )
type Data struct {
//user, which user saved this
//data, does this just go interface?
//date saved?
//expires?
}
// basic bot structure containing discordgo connection as well as the command map // basic bot structure containing discordgo connection as well as the command map
type bolt struct { type bolt struct {
*dg.Session //holds discordgo internals *dg.Session //holds discordgo internals
commands map[string]Command //maps trigger phrase to command struct for fast lookup commands map[string]Command //maps trigger phrase to command struct for fast lookup
indicator string //the indicator used to detect whether a message is a command indicator string //the indicator used to detect whether a message is a command
logLvl LogLevel //determines how much the bot logs logLvl LogLevel //determines how much the bot logs
db lite.Database
} }
type Bolt interface { type Bolt interface {
Start() error Start() error
AddCommands(cmd ...Command) AddCommands(cmd ...Command)
Database(file string) error
//filtered methods //filtered methods
stop() error stop() error
messageHandler(s *dg.Session, msg *dg.MessageCreate) messageHandler(s *dg.Session, msg *dg.MessageCreate)
@@ -97,8 +110,26 @@ func (b *bolt) Start() error {
return nil return nil
} }
func (b *bolt) Database(file string) error {
if file == "" {
file = DEFAULT_DB_NAME
}
db, err := lite.New(lite.WithFile(file), lite.WithPath(DB_PATH))
if err != nil {
return err
}
b.db = db
return nil
}
// stops the bot // stops the bot
func (b *bolt) stop() error { func (b *bolt) stop() error {
if b.db != nil {
b.db.Close()
}
return b.Close() return b.Close()
} }

13
go.mod
View File

@@ -2,10 +2,17 @@ module code.jakeyoungdev.com/jake/bolt
go 1.24.0 go 1.24.0
require github.com/bwmarrin/discordgo v0.29.0 require (
code.jakeyoungdev.com/go/lite v0.3.0
github.com/bwmarrin/discordgo v0.29.0
)
require ( require (
github.com/gorilla/websocket v1.4.2 // indirect github.com/gorilla/websocket v1.4.2 // indirect
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b // indirect github.com/jmoiron/sqlx v1.4.0 // indirect
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect github.com/ncruces/go-sqlite3 v0.26.1 // indirect
github.com/ncruces/julianday v1.0.0 // indirect
github.com/tetratelabs/wazero v1.9.0 // indirect
golang.org/x/crypto v0.39.0 // indirect
golang.org/x/sys v0.33.0 // indirect
) )

26
go.sum
View File

@@ -1,12 +1,34 @@
code.jakeyoungdev.com/go/lite v0.3.0 h1:QJuinHNtb3h+f0Cht1UNzOmUTT7YyaFYCaYAmCHAxMg=
code.jakeyoungdev.com/go/lite v0.3.0/go.mod h1:NadLydJU2G+RsyokYjA/+EnwyNoMujswVwfZ1SQx1+E=
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno= github.com/bwmarrin/discordgo v0.29.0 h1:FmWeXFaKUwrcL3Cx65c20bTRW+vOb6k8AnaP+EgjDno=
github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY= github.com/bwmarrin/discordgo v0.29.0/go.mod h1:NJZpH+1AfhIcyQsPeuBKsUtYrRnjkyu0kIVMCHkZtRY=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc= github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0Ufc=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b h1:7mWr3k41Qtv8XlltBkDkl8LoP3mpSgBW8BUoxtEdbXg= github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/ncruces/go-sqlite3 v0.26.1 h1:lBXmbmucH1Bsj57NUQR6T84UoMN7jnNImhF+ibEITJU=
github.com/ncruces/go-sqlite3 v0.26.1/go.mod h1:XFTPtFIo1DmGCh+XVP8KGn9b/o2f+z0WZuT09x2N6eo=
github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M=
github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g=
github.com/tetratelabs/wazero v1.9.0 h1:IcZ56OuxrtaEz8UYNRHBrUa9bYeX9oVY93KspZZBf/I=
github.com/tetratelabs/wazero v1.9.0/go.mod h1:TSbcXCfFP0L2FGkRPxHphadXPjo1T6W+CseNNY7EkjM=
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=

View File

@@ -6,11 +6,6 @@ import (
dg "github.com/bwmarrin/discordgo" dg "github.com/bwmarrin/discordgo"
) )
const (
// the max discord allows for basic messages
MSG_MAX_LENGTH = 2000
)
// the message struct is passed to the command payload providing basic // the message struct is passed to the command payload providing basic
// message information and needed methods // message information and needed methods
type Message struct { type Message struct {
@@ -32,36 +27,8 @@ func (m *Message) React(emoji Reaction) error {
return m.sesh.MessageReactionAdd(m.channelID, m.msgID, fmt.Sprint(emoji)) return m.sesh.MessageReactionAdd(m.channelID, m.msgID, fmt.Sprint(emoji))
} }
// sends response to message, if the response length is greater than 2000 characters the // sends response to message
// messages are split and sent seperatly
func (m *Message) Respond(res string) error { func (m *Message) Respond(res string) error {
if len(res) > MSG_MAX_LENGTH {
for len(res) > 0 {
//send full chunk size allowed by discord
sc := res[:MSG_MAX_LENGTH]
rep := m.sesh.createReply(sc, m.msgID, m.channelID, m.serverID)
_, err := m.sesh.ChannelMessageSendComplex(m.channelID, rep)
if err != nil {
return err
}
res = res[MSG_MAX_LENGTH:]
//if we have left than a full chunk send the rest and break the loop
if len(res) < MSG_MAX_LENGTH {
final := m.sesh.createReply(res, m.msgID, m.channelID, m.serverID)
_, err := m.sesh.ChannelMessageSendComplex(m.channelID, final)
if err != nil {
return err
}
break
}
}
return nil
}
//short enough message to send in one message
rep := m.sesh.createReply(res, m.msgID, m.channelID, m.serverID) rep := m.sesh.createReply(res, m.msgID, m.channelID, m.serverID)
_, err := m.sesh.ChannelMessageSendComplex(m.channelID, rep) _, err := m.sesh.ChannelMessageSendComplex(m.channelID, rep)
return err return err