-
Notifications
You must be signed in to change notification settings - Fork 0
/
messenge_manager.go
143 lines (122 loc) · 3.76 KB
/
messenge_manager.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
package manager
import (
"database/sql"
"github.com/duo/octopus/internal/common"
"github.com/duo/octopus/internal/db"
)
func init() {
if _, err := db.DB.Exec(`BEGIN;
CREATE TABLE IF NOT EXISTS message (
id INTEGER PRIMARY KEY,
master_limb TEXT NOT NULL,
master_msg_id TEXT NOT NULL,
master_msg_thread_id TEXT NOT NULL,
slave_limb TEXT NOT NULL,
slave_msg_id TEXT NOT NULL,
slave_sender TEXT NOT NULL,
content TEXT NOT NULL,
timestamp INTEGER NOT NULL,
created DATETIME DEFAULT CURRENT_TIMESTAMP,
UNIQUE(master_limb, master_msg_id)
);
CREATE INDEX IF NOT EXISTS idx_slave_reply ON message (slave_limb, timestamp);
CREATE INDEX IF NOT EXISTS idx_master_reply ON message (master_limb, master_msg_id);
COMMIT;`); err != nil {
panic(err)
}
}
type Message struct {
ID string
MasterLimb string
MasterMsgID string
MasterMsgThreadID string
SlaveLimb string
SlaveMsgID string
SlaveSender string
Content string
Timestamp int64
}
func AddMessage(m *Message) error {
_, err := db.DB.Exec(`INSERT INTO message
(master_limb, master_msg_id, master_msg_thread_id, slave_limb, slave_msg_id, slave_sender, content, timestamp)
VALUES (?, ?, ?, ?, ?, ?, ?, ?);`,
m.MasterLimb, m.MasterMsgID, m.MasterMsgThreadID, m.SlaveLimb, m.SlaveMsgID, m.SlaveSender, m.Content, m.Timestamp,
)
return err
}
func GetMessageByMasterMsgId(masterLimb, masterMsgId string) (*Message, error) {
rows, err := db.DB.Query(`SELECT id, master_limb, master_msg_id, master_msg_thread_id, slave_limb, slave_msg_id, slave_sender, content, timestamp
FROM message
WHERE master_limb = ? AND master_msg_id = ?;`,
masterLimb, masterMsgId)
if err != nil {
return nil, err
}
defer rows.Close()
hasNext := rows.Next()
if hasNext {
m := &Message{}
err = rows.Scan(&m.ID, &m.MasterLimb, &m.MasterMsgID, &m.MasterMsgThreadID, &m.SlaveLimb, &m.SlaveMsgID, &m.SlaveSender, &m.Content, &m.Timestamp)
if err != nil {
return nil, err
}
return m, err
}
return nil, nil
}
func GetMessagesBySlave(slaveLimb, slaveMsgId string) ([]*Message, error) {
messages := []*Message{}
rows, err := db.DB.Query(`SELECT id, master_limb, master_msg_id, master_msg_thread_id, slave_limb, slave_msg_id, content
FROM message
WHERE slave_limb = ? AND slave_msg_id = ?;`,
slaveLimb, slaveMsgId)
if err != nil {
return messages, err
}
defer rows.Close()
for rows.Next() {
m := &Message{}
err := rows.Scan(&m.ID, &m.MasterLimb, &m.MasterMsgID, &m.MasterMsgThreadID, &m.SlaveLimb, &m.SlaveMsgID, &m.Content)
if err != nil {
return messages, err
}
messages = append(messages, m)
}
if err = rows.Err(); err != nil {
return messages, err
}
return messages, nil
}
func GetMessagesBySlaveReply(slaveLimb string, reply *common.ReplyInfo) ([]*Message, error) {
messages := []*Message{}
var rows *sql.Rows
var err error
if reply.Timestamp == 0 {
rows, err = db.DB.Query(`SELECT id, master_limb, master_msg_id, master_msg_thread_id, slave_limb, slave_msg_id, content
FROM message
WHERE slave_limb = ? AND slave_msg_id = ?;`,
slaveLimb, reply.ID)
} else {
// TODO: back search?
rows, err = db.DB.Query(`SELECT id, master_limb, master_msg_id, master_msg_thread_id, slave_limb, slave_msg_id, content
FROM message
WHERE slave_limb = ? AND timestamp = ? AND slave_msg_id LIKE ?;`,
slaveLimb, reply.Timestamp, reply.ID+"%")
}
if err != nil {
return messages, err
}
defer rows.Close()
for rows.Next() {
m := &Message{}
err := rows.Scan(&m.ID, &m.MasterLimb, &m.MasterMsgID, &m.MasterMsgThreadID, &m.SlaveLimb, &m.SlaveMsgID, &m.Content)
if err != nil {
return messages, err
}
messages = append(messages, m)
}
if err = rows.Err(); err != nil {
return messages, err
}
return messages, nil
}