emoji signaling
This commit is contained in:
3
vendor/gitlab.com/etke.cc/linkpearl/config.go
generated
vendored
3
vendor/gitlab.com/etke.cc/linkpearl/config.go
generated
vendored
@@ -39,6 +39,9 @@ type Config struct {
|
||||
// MaxRetries for operations like auto join
|
||||
MaxRetries int
|
||||
|
||||
// EventsLimit for methods like lp.Threads() or lp.FindEventBy()
|
||||
EventsLimit int
|
||||
|
||||
// Logger
|
||||
Logger zerolog.Logger
|
||||
|
||||
|
||||
73
vendor/gitlab.com/etke.cc/linkpearl/events.go
generated
vendored
Normal file
73
vendor/gitlab.com/etke.cc/linkpearl/events.go
generated
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
package linkpearl
|
||||
|
||||
import (
|
||||
"strconv"
|
||||
|
||||
"maunium.net/go/mautrix"
|
||||
"maunium.net/go/mautrix/event"
|
||||
"maunium.net/go/mautrix/id"
|
||||
)
|
||||
|
||||
// RespThreads is response of https://spec.matrix.org/v1.8/client-server-api/#get_matrixclientv1roomsroomidthreads
|
||||
type RespThreads struct {
|
||||
Chunk []*event.Event `json:"chunk"`
|
||||
NextBatch string `json:"next_batch"`
|
||||
}
|
||||
|
||||
// Threads endpoint, ref: https://spec.matrix.org/v1.8/client-server-api/#get_matrixclientv1roomsroomidthreads
|
||||
func (l *Linkpearl) Threads(roomID id.RoomID, fromToken ...string) (*RespThreads, error) {
|
||||
var from string
|
||||
if len(fromToken) > 0 {
|
||||
from = fromToken[0]
|
||||
}
|
||||
|
||||
query := map[string]string{
|
||||
"from": from,
|
||||
"limit": strconv.Itoa(l.eventsLimit),
|
||||
}
|
||||
|
||||
var resp *RespThreads
|
||||
urlPath := l.GetClient().BuildURLWithQuery(mautrix.ClientURLPath{"v1", "rooms", roomID, "threads"}, query)
|
||||
_, err := l.GetClient().MakeRequest("GET", urlPath, nil, &resp)
|
||||
return resp, UnwrapError(err)
|
||||
}
|
||||
|
||||
// FindEventBy tries to find event by field and value
|
||||
func (l *Linkpearl) FindEventBy(roomID id.RoomID, field, value string, fromToken ...string) *event.Event {
|
||||
var from string
|
||||
if len(fromToken) > 0 {
|
||||
from = fromToken[0]
|
||||
}
|
||||
|
||||
resp, err := l.GetClient().Messages(roomID, from, "", mautrix.DirectionBackward, nil, l.eventsLimit)
|
||||
err = UnwrapError(err)
|
||||
if err != nil {
|
||||
l.log.Warn().Err(err).Str("roomID", roomID.String()).Msg("cannot get room events")
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, msg := range resp.Chunk {
|
||||
evt, contains := l.eventContains(msg, field, value)
|
||||
if contains {
|
||||
return evt
|
||||
}
|
||||
}
|
||||
|
||||
if resp.End == "" { // nothing more
|
||||
return nil
|
||||
}
|
||||
|
||||
return l.FindEventBy(roomID, field, value, resp.End)
|
||||
}
|
||||
|
||||
func (l *Linkpearl) eventContains(evt *event.Event, field, value string) (*event.Event, bool) {
|
||||
if evt.Type == event.EventEncrypted {
|
||||
ParseContent(evt, &l.log)
|
||||
decrypted, err := l.GetClient().Crypto.Decrypt(evt)
|
||||
if err == nil {
|
||||
evt = decrypted
|
||||
}
|
||||
}
|
||||
|
||||
return evt, EventContains(evt, field, value)
|
||||
}
|
||||
29
vendor/gitlab.com/etke.cc/linkpearl/linkpearl.go
generated
vendored
29
vendor/gitlab.com/etke.cc/linkpearl/linkpearl.go
generated
vendored
@@ -18,6 +18,8 @@ const (
|
||||
DefaultMaxRetries = 10
|
||||
// DefaultAccountDataCache size
|
||||
DefaultAccountDataCache = 1000
|
||||
// DefaultEventsLimit for methods like lp.Threads() and lp.FindEventBy()
|
||||
DefaultEventsLimit = 1000
|
||||
)
|
||||
|
||||
// Linkpearl object
|
||||
@@ -29,9 +31,10 @@ type Linkpearl struct {
|
||||
log zerolog.Logger
|
||||
api *mautrix.Client
|
||||
|
||||
joinPermit func(*event.Event) bool
|
||||
autoleave bool
|
||||
maxretries int
|
||||
joinPermit func(*event.Event) bool
|
||||
autoleave bool
|
||||
maxretries int
|
||||
eventsLimit int
|
||||
}
|
||||
|
||||
type ReqPresence struct {
|
||||
@@ -46,6 +49,9 @@ func setDefaults(cfg *Config) {
|
||||
if cfg.AccountDataCache == 0 {
|
||||
cfg.AccountDataCache = DefaultAccountDataCache
|
||||
}
|
||||
if cfg.EventsLimit == 0 {
|
||||
cfg.EventsLimit = DefaultEventsLimit
|
||||
}
|
||||
if cfg.JoinPermit == nil {
|
||||
// By default, we approve all join requests
|
||||
cfg.JoinPermit = func(*event.Event) bool { return true }
|
||||
@@ -76,14 +82,15 @@ func New(cfg *Config) (*Linkpearl, error) {
|
||||
}
|
||||
|
||||
lp := &Linkpearl{
|
||||
db: cfg.DB,
|
||||
acc: acc,
|
||||
acr: acr,
|
||||
api: api,
|
||||
log: cfg.Logger,
|
||||
joinPermit: cfg.JoinPermit,
|
||||
autoleave: cfg.AutoLeave,
|
||||
maxretries: cfg.MaxRetries,
|
||||
db: cfg.DB,
|
||||
acc: acc,
|
||||
acr: acr,
|
||||
api: api,
|
||||
log: cfg.Logger,
|
||||
joinPermit: cfg.JoinPermit,
|
||||
autoleave: cfg.AutoLeave,
|
||||
maxretries: cfg.MaxRetries,
|
||||
eventsLimit: cfg.EventsLimit,
|
||||
}
|
||||
|
||||
db, err := dbutil.NewWithDB(cfg.DB, cfg.Dialect)
|
||||
|
||||
33
vendor/gitlab.com/etke.cc/linkpearl/send.go
generated
vendored
33
vendor/gitlab.com/etke.cc/linkpearl/send.go
generated
vendored
@@ -43,24 +43,37 @@ func (l *Linkpearl) SendNotice(roomID id.RoomID, message string, relates ...*eve
|
||||
}
|
||||
|
||||
// SendFile to a matrix room
|
||||
func (l *Linkpearl) SendFile(roomID id.RoomID, req *mautrix.ReqUploadMedia, msgtype event.MessageType, relation *event.RelatesTo) error {
|
||||
func (l *Linkpearl) SendFile(roomID id.RoomID, req *mautrix.ReqUploadMedia, msgtype event.MessageType, relates ...*event.RelatesTo) error {
|
||||
var relation *event.RelatesTo
|
||||
if len(relates) > 0 {
|
||||
relation = relates[0]
|
||||
}
|
||||
|
||||
resp, err := l.GetClient().UploadMedia(*req)
|
||||
if err != nil {
|
||||
err = UnwrapError(err)
|
||||
l.log.Error().Err(err).Str("file", req.FileName).Msg("cannot upload file")
|
||||
return err
|
||||
}
|
||||
_, err = l.Send(roomID, &event.Content{
|
||||
Parsed: &event.MessageEventContent{
|
||||
MsgType: msgtype,
|
||||
Body: req.FileName,
|
||||
URL: resp.ContentURI.CUString(),
|
||||
RelatesTo: relation,
|
||||
},
|
||||
})
|
||||
content := &event.MessageEventContent{
|
||||
MsgType: msgtype,
|
||||
Body: req.FileName,
|
||||
URL: resp.ContentURI.CUString(),
|
||||
RelatesTo: relation,
|
||||
}
|
||||
|
||||
_, err = l.Send(roomID, content)
|
||||
err = UnwrapError(err)
|
||||
if err != nil {
|
||||
l.log.Error().Err(err).Str("file", req.FileName).Msg("cannot send uploaded file")
|
||||
l.log.Error().Err(err).Str("roomID", roomID.String()).Str("retries", "1/2").Msg("cannot send file into the room")
|
||||
if relation != nil {
|
||||
content.RelatesTo = nil
|
||||
_, err = l.Send(roomID, &content)
|
||||
err = UnwrapError(err)
|
||||
if err != nil {
|
||||
l.log.Error().Err(UnwrapError(err)).Str("roomID", roomID.String()).Str("retries", "2/2").Msg("cannot send file into the room even without relations")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return err
|
||||
|
||||
2
vendor/gitlab.com/etke.cc/linkpearl/sync.go
generated
vendored
2
vendor/gitlab.com/etke.cc/linkpearl/sync.go
generated
vendored
@@ -79,7 +79,7 @@ func (l *Linkpearl) tryJoin(roomID id.RoomID, retry int) {
|
||||
err = UnwrapError(err)
|
||||
if err != nil {
|
||||
l.log.Error().Err(err).Str("roomID", roomID.String()).Msg("cannot join room")
|
||||
if strings.HasPrefix(err.Error(), "403") { // no permission to join, no need to retry
|
||||
if strings.HasPrefix(err.Error(), "403") || strings.HasPrefix(err.Error(), "M_FORBIDDEN") { // no permission to join, no need to retry
|
||||
return
|
||||
}
|
||||
time.Sleep(5 * time.Second)
|
||||
|
||||
6
vendor/gitlab.com/etke.cc/linkpearl/utils.go
generated
vendored
6
vendor/gitlab.com/etke.cc/linkpearl/utils.go
generated
vendored
@@ -84,11 +84,7 @@ func EventContains[T comparable](evt *event.Event, field string, value T) bool {
|
||||
if evt.Content.Raw == nil {
|
||||
return false
|
||||
}
|
||||
if EventField[T](&evt.Content, field) != value {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
return EventField[T](&evt.Content, field) == value
|
||||
}
|
||||
|
||||
// EventField returns field value from raw event content
|
||||
|
||||
Reference in New Issue
Block a user