1
0
Fork 0

lelegram: stuckness fixes, timeout

Change-Id: I3c1ad4e589ea66db846a56aab8a2c1698bdee539
master
q3k 2020-01-23 14:18:25 +01:00
parent 400ac7a88d
commit 83e2690070
5 changed files with 30 additions and 8 deletions

View File

@ -8,7 +8,7 @@ local kube = import "../../kube/kube.libsonnet";
},
image: {
teleimg: "registry.k0.hswaw.net/q3k/teleimg:1578259776-a07688fe74efe1e190d58092a9f50d4275a15e3d",
lelegram: "registry.k0.hswaw.net/q3k/lelegram:1578255597-a885488fd0f9fcd271f6a02416aae5bb3fd9c9ac",
lelegram: "registry.k0.hswaw.net/q3k/lelegram:1579785132-a2ee865a0cb74f88ba4b9861598e1efe78c4f066",
},
bridge: {
telegram: "-1001345766954",

View File

@ -4,6 +4,7 @@ import (
"context"
"fmt"
"net"
"regexp"
"strings"
"sync"
"sync/atomic"
@ -52,6 +53,8 @@ type ircconn struct {
connected int64
}
var reIRCNick = regexp.MustCompile(`[^a-z0-09]`)
// Say is called by the Manager when a message should be sent out by the
// connection.
func (i *ircconn) Say(msg *controlMessage) {
@ -100,10 +103,14 @@ func NewConn(server, channel, user string, backup bool, h func(e *event)) (*ircc
}
// Generate IRC nick from username.
nick := user
nick := reIRCNick.ReplaceAllString(user, "")
if len(nick) > 13 {
nick = nick[:13]
}
if len(nick) == 0 {
glog.Errorf("Could not create IRC nick for %q", user)
nick = "wtf"
}
nick += "[t]"
// Configure IRC client to populate the IRC Queue.
@ -186,7 +193,7 @@ func (i *ircconn) loop(ctx context.Context) {
})
if err != nil {
glog.Errorf("IRC/%s: WriteMessage: %v", i.user, err)
die()
die(err)
s.done <- err
return
}

View File

@ -8,16 +8,23 @@ import (
)
// Control: send a message to IRC.
func (m *Manager) SendMessage(user, text string) error {
func (m *Manager) SendMessage(ctx context.Context, user, text string) error {
done := make(chan error)
m.ctrl <- &control{
msg := &control{
message: &controlMessage{
from: user,
message: text,
done: done,
},
}
return <-done
select {
case <-ctx.Done():
return ctx.Err()
case m.ctrl <- msg:
return <-done
}
}
// Control: subscribe to notifiactions.

View File

@ -6,6 +6,7 @@ import (
"fmt"
"strconv"
"strings"
"time"
"code.hackerspace.pl/hscloud/go/mirko"
@ -155,12 +156,14 @@ func (s *server) bridge(ctx context.Context) {
// This blocks until success or failure, making sure the log stays
// totally ordered in the face of some of our IRC connections being
// dead/slow.
err := s.mgr.SendMessage(m.user, text)
ctxT, cancel := context.WithTimeout(ctx, 15*time.Second)
err := s.mgr.SendMessage(ctxT, m.user, text)
if err != nil {
glog.Warningf("Attempting redelivery of %v after error: %v...", m, err)
err = s.mgr.SendMessage(m.user, text)
err = s.mgr.SendMessage(ctx, m.user, text)
glog.Errorf("Redelivery of %v failed: %v...", m, err)
}
cancel()
case n := <-s.ircLog:
// Notification from IRC (message or new nickmap)

View File

@ -38,6 +38,11 @@ func (s *server) telegramConnection(ctx context.Context) error {
glog.Infof("[ignored group %d] <%s> %v", u.Message.Chat.ID, u.Message.From, u.Message.Text)
continue
}
date := time.Unix(int64(u.Message.Date), 0)
if time.Since(date) > 2*time.Minute {
glog.Infof("[old message] <%s> %v", u.Message.From, u.Message.Text)
continue
}
if msg := plainFromTelegram(s.tel.Self.ID, &u); msg != nil {
s.telLog <- msg
}