summaryrefslogtreecommitdiff
path: root/internal/message.go
diff options
context:
space:
mode:
authorilotterytea <iltsu@alright.party>2025-08-03 17:56:12 +0500
committerilotterytea <iltsu@alright.party>2025-08-03 17:56:12 +0500
commit9a20de85770f2f5ba09ad492aa2fb06782966096 (patch)
tree9c5ef003093c6db54b44eb0c56b98f7b7c8cd9f5 /internal/message.go
parentc2432518c6ae67afa40c68c2a466ba34728e5de6 (diff)
feat: save messages into the database
Diffstat (limited to 'internal/message.go')
-rw-r--r--internal/message.go65
1 files changed, 64 insertions, 1 deletions
diff --git a/internal/message.go b/internal/message.go
index e8df9a4..46dae07 100644
--- a/internal/message.go
+++ b/internal/message.go
@@ -1,6 +1,12 @@
package irclogs
-import "strings"
+import (
+ "database/sql"
+ "fmt"
+ "log"
+ "slices"
+ "strings"
+)
type IRCMessage struct {
Tags map[string]string
@@ -62,3 +68,60 @@ func ParseIRCMessage(message string) IRCMessage {
return msg
}
+
+func (m *IRCMessage) Save(db *sql.DB, serverId int) {
+ var roomId int
+ var roomDepart sql.NullTime
+ err := db.QueryRow(
+ "SELECT id, departed_at FROM rooms WHERE name = ? AND server_id = ?",
+ m.Params[0], serverId,
+ ).Scan(&roomId, &roomDepart)
+ if err != nil || roomDepart.Valid {
+ return
+ }
+
+ var userId int64
+ var userDepart sql.NullTime
+ err = db.QueryRow(
+ "SELECT id, departed_at FROM users WHERE server_id = ? AND nick = ?",
+ serverId, m.Nick,
+ ).Scan(&userId, &userDepart)
+ if err == sql.ErrNoRows {
+ res, err := db.Exec("INSERT INTO users(server_id, nick) VALUES (?, ?)", serverId, m.Nick)
+ if err != nil {
+ log.Panicf("Failed to create a new user: %v\n", err)
+ }
+ userId, _ = res.LastInsertId()
+ } else if err != nil {
+ log.Panicf("Failed to get a user: %v\n", err)
+ } else if userDepart.Valid {
+ return
+ }
+
+ tags := sql.NullString{
+ String: "",
+ Valid: len(m.Tags) > 0,
+ }
+ for k, v := range m.Tags {
+ tags.String += fmt.Sprintf("%s=%s;", k, v)
+ }
+ if len(tags.String) > 0 {
+ tags.String = tags.String[:len(tags.String)-1]
+ }
+
+ if len(m.Params) > 0 && m.Params[0][0] == '#' {
+ m.Params = slices.Delete(m.Params, 0, 1)
+ }
+
+ params := sql.NullString{
+ String: strings.Join(m.Params, " "),
+ Valid: len(m.Params) > 0,
+ }
+
+ _, err = db.Exec("INSERT INTO messages(room_id, user_id, command, params, tags) VALUES (?, ?, ?, ?, ?)",
+ roomId, userId, m.Command, params, tags)
+
+ if err != nil {
+ log.Panicf("Failed to add a message: %v\n", err)
+ }
+}