- Introduced Weixin integration support with new configuration options for WeChat iLink Bot. - Updated existing adapters (DingTalk, Discord, Feishu, Telegram) to include sender_id and app_id in message metadata for improved context handling. - Enhanced dispatcher logic to accommodate the new Weixin adapter and ensure proper initialization and shutdown processes. - Improved message handling across integrations to support typing indicators, providing a more interactive user experience.
44 lines
741 B
Go
44 lines
741 B
Go
package weixin
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
dedupTTL = 24 * time.Hour
|
|
dedupCleanInterval = time.Hour
|
|
)
|
|
|
|
type dedupStore struct {
|
|
m sync.Map
|
|
}
|
|
|
|
func newDedupStore() *dedupStore {
|
|
return &dedupStore{}
|
|
}
|
|
|
|
func (d *dedupStore) markSeen(key string) bool {
|
|
now := time.Now().Unix()
|
|
_, loaded := d.m.LoadOrStore(key, now)
|
|
return !loaded
|
|
}
|
|
|
|
func (d *dedupStore) cleaner(stopCh <-chan struct{}) {
|
|
ticker := time.NewTicker(dedupCleanInterval)
|
|
defer ticker.Stop()
|
|
for {
|
|
select {
|
|
case <-stopCh:
|
|
return
|
|
case <-ticker.C:
|
|
cutoff := time.Now().Add(-dedupTTL).Unix()
|
|
d.m.Range(func(key, value any) bool {
|
|
if ts, ok := value.(int64); ok && ts < cutoff {
|
|
d.m.Delete(key)
|
|
}
|
|
return true
|
|
})
|
|
}
|
|
}
|
|
}
|