@@ -19,6 +19,7 @@ import (
19
19
"github.com/larksuite/oapi-sdk-go/v3/core/httpserverext"
20
20
larkevent "github.com/larksuite/oapi-sdk-go/v3/event"
21
21
larkim "github.com/larksuite/oapi-sdk-go/v3/service/im/v1"
22
+ larkws "github.com/larksuite/oapi-sdk-go/v3/ws"
22
23
23
24
"github.com/larksuite/oapi-sdk-go/v3/event/dispatcher"
24
25
@@ -66,8 +67,7 @@ func New(cfg *Config, db *database.DB, tlsConfig *tls.Config, acts actions.Actio
66
67
var client = lark .NewClient (
67
68
cfg .AppID ,
68
69
cfg .AppSecret ,
69
- lark .WithLogReqAtDebug (true ),
70
- lark .WithLogLevel (larkcore .LogLevelDebug ),
70
+ lark .WithLogLevel (larkcore .LogLevelInfo ),
71
71
lark .WithHttpClient (httpClient ))
72
72
73
73
// Check that AppID and AppSecret are valid
@@ -113,38 +113,52 @@ func New(cfg *Config, db *database.DB, tlsConfig *tls.Config, acts actions.Actio
113
113
}
114
114
115
115
func (lrk * Lark ) Start () error {
116
+ var dispatcher * dispatcher.EventDispatcher
116
117
118
+ // Webhooks by default
119
+ if lrk .cfg .Mode == ModeWebhook || lrk .cfg .Mode == "" {
120
+ dispatcher = lrk .makeDispatcher (lrk .cfg .VerificationToken , lrk .cfg .EncryptKey , true )
121
+ return lrk .startWebhook (dispatcher )
122
+ } else {
123
+ dispatcher = lrk .makeDispatcher ("" , "" , false )
124
+ return lrk .startWebsocket (dispatcher )
125
+ }
126
+ }
127
+
128
+ func (lrk * Lark ) makeDispatcher (verificationToken , eventEncryptKey string , dedupEvents bool ) * dispatcher.EventDispatcher {
117
129
// Sometimes the same event is sent several times, so keep recent event ids
118
130
// to prevent handling the same event more than once.
119
131
recentEvents := map [string ]time.Time {}
120
132
recentEventsMutex := sync.Mutex {}
121
133
122
- ticker := time .NewTicker (10 * time .Second )
123
- go func () {
124
- for {
125
- select {
126
- case <- ticker .C :
127
- toRemove := make ([]string , 0 )
128
-
129
- for eventID , handledAt := range recentEvents {
130
-
131
- // Cleanup events after 10m
132
- // TODO: config
133
- if time .Since (handledAt ) > time .Minute * 5 {
134
- toRemove = append (toRemove , eventID )
134
+ if dedupEvents {
135
+ go func () {
136
+ ticker := time .NewTicker (10 * time .Second )
137
+ for {
138
+ select {
139
+ case <- ticker .C :
140
+ toRemove := make ([]string , 0 )
141
+
142
+ for eventID , handledAt := range recentEvents {
143
+
144
+ // Cleanup events after 10m
145
+ // TODO: config
146
+ if time .Since (handledAt ) > time .Minute * 5 {
147
+ toRemove = append (toRemove , eventID )
148
+ }
135
149
}
136
- }
137
150
138
- recentEventsMutex .Lock ()
139
- for _ , eventID := range toRemove {
140
- delete (recentEvents , eventID )
151
+ recentEventsMutex .Lock ()
152
+ for _ , eventID := range toRemove {
153
+ delete (recentEvents , eventID )
154
+ }
155
+ recentEventsMutex .Unlock ()
141
156
}
142
- recentEventsMutex .Unlock ()
143
157
}
144
- }
145
- }()
158
+ }()
159
+ }
146
160
147
- handler := dispatcher .NewEventDispatcher (lrk . cfg . VerificationToken , lrk . cfg . EncryptKey ).
161
+ return dispatcher .NewEventDispatcher (verificationToken , eventEncryptKey ).
148
162
OnP2MessageReceiveV1 (
149
163
func (ctx context.Context , event * larkim.P2MessageReceiveV1 ) error {
150
164
@@ -159,17 +173,19 @@ func (lrk *Lark) Start() error {
159
173
return nil
160
174
}
161
175
162
- eventID := event .EventV2Base .Header .EventID
176
+ if dedupEvents {
177
+ eventID := event .EventV2Base .Header .EventID
163
178
164
- recentEventsMutex .Lock ()
165
- if _ , ok := recentEvents [eventID ]; ok {
166
- recentEventsMutex .Unlock ()
179
+ recentEventsMutex .Lock ()
180
+ if _ , ok := recentEvents [eventID ]; ok {
181
+ recentEventsMutex .Unlock ()
167
182
168
- // Event was already handled
169
- return nil
183
+ // Event was already handled
184
+ return nil
185
+ }
186
+ recentEvents [eventID ] = time .Now ()
187
+ recentEventsMutex .Unlock ()
170
188
}
171
- recentEvents [eventID ] = time .Now ()
172
- recentEventsMutex .Unlock ()
173
189
174
190
userID := event .Event .Sender .SenderId .UserId
175
191
msgID := event .Event .Message .MessageId
@@ -234,12 +250,23 @@ func (lrk *Lark) Start() error {
234
250
return nil
235
251
},
236
252
)
253
+ }
254
+
255
+ func (lrk * Lark ) startWebsocket (eventHandler * dispatcher.EventDispatcher ) error {
256
+ cli := larkws .NewClient (lrk .cfg .AppID , lrk .cfg .AppSecret ,
257
+ larkws .WithEventHandler (eventHandler ),
258
+ larkws .WithLogLevel (larkcore .LogLevelInfo ),
259
+ )
260
+
261
+ return cli .Start (context .TODO ())
262
+ }
237
263
264
+ func (lrk * Lark ) startWebhook (eventHandler * dispatcher.EventDispatcher ) error {
238
265
mux := http .NewServeMux ()
239
266
240
267
// TODO: take path from config
241
- mux .HandleFunc ("/webhook/event" , httpserverext .NewEventHandlerFunc (handler ,
242
- larkevent .WithLogLevel (larkcore .LogLevelDebug )))
268
+ mux .HandleFunc ("/webhook/event" , httpserverext .NewEventHandlerFunc (eventHandler ,
269
+ larkevent .WithLogLevel (larkcore .LogLevelInfo )))
243
270
244
271
// TODO: take port from config
245
272
srv := http.Server {
0 commit comments