lelegram: stuckness fixes, timeout
Change-Id: I3c1ad4e589ea66db846a56aab8a2c1698bdee539
diff --git a/personal/q3k/lelegram/irc/conn.go b/personal/q3k/lelegram/irc/conn.go
index 7f130ca..9f1f4ef 100644
--- a/personal/q3k/lelegram/irc/conn.go
+++ b/personal/q3k/lelegram/irc/conn.go
@@ -4,6 +4,7 @@
"context"
"fmt"
"net"
+ "regexp"
"strings"
"sync"
"sync/atomic"
@@ -52,6 +53,8 @@
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 @@
}
// 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 @@
})
if err != nil {
glog.Errorf("IRC/%s: WriteMessage: %v", i.user, err)
- die()
+ die(err)
s.done <- err
return
}
diff --git a/personal/q3k/lelegram/irc/manager_control.go b/personal/q3k/lelegram/irc/manager_control.go
index 68e9002..4e6b0b7 100644
--- a/personal/q3k/lelegram/irc/manager_control.go
+++ b/personal/q3k/lelegram/irc/manager_control.go
@@ -8,16 +8,23 @@
)
// 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.
diff --git a/personal/q3k/lelegram/main.go b/personal/q3k/lelegram/main.go
index ef1ce37..f4360a9 100644
--- a/personal/q3k/lelegram/main.go
+++ b/personal/q3k/lelegram/main.go
@@ -6,6 +6,7 @@
"fmt"
"strconv"
"strings"
+ "time"
"code.hackerspace.pl/hscloud/go/mirko"
@@ -155,12 +156,14 @@
// 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)
diff --git a/personal/q3k/lelegram/telegram.go b/personal/q3k/lelegram/telegram.go
index bfb5df9..e6b673c 100644
--- a/personal/q3k/lelegram/telegram.go
+++ b/personal/q3k/lelegram/telegram.go
@@ -38,6 +38,11 @@
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
}