Skip to content

Commit ec4f264

Browse files
committed
fix some bugs in messageHelper
1 parent 2b651f4 commit ec4f264

2 files changed

Lines changed: 78 additions & 9 deletions

File tree

engine/messageHelper.go

Lines changed: 62 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ import (
44
"MirrorBotGo/utils"
55
"errors"
66
"fmt"
7-
"go.uber.org/ratelimit"
87
"runtime"
98
"runtime/pprof"
109
"strings"
1110
"sync"
1211
"time"
1312

13+
"go.uber.org/ratelimit"
14+
1415
"github.com/PaulSonOfLars/gotgbot/v2"
1516
"github.com/shirou/gopsutil/v3/cpu"
1617
)
@@ -88,10 +89,26 @@ func SendMessageImpl(b *gotgbot.Bot, messageText string, message *gotgbot.Messag
8889
if isMessageNotFoundError(err) {
8990
break
9091
}
92+
var sleepTime time.Duration
9193
retries += 1
92-
sleepTime := time.Duration(SleepMultiplier*float32(retries)) * time.Second
93-
L().Errorf("SendMessage: %v, sleeping for %s, retry: %d", err, sleepTime, retries)
94-
time.Sleep(sleepTime)
94+
if isMessageFloodWaitError(err) {
95+
L().Infof("flood wait error detected: %v", err)
96+
parsedDuration, err := utils.ParseMessageFloodWaitDuration(err)
97+
if err != nil {
98+
L().Errorf("error while parsing flood wait sleep duration: %v", err)
99+
} else {
100+
sleepTime = time.Duration(parsedDuration) * time.Second
101+
}
102+
} else {
103+
sleepTime = time.Duration(SleepMultiplier*float32(retries)) * time.Second
104+
}
105+
if sleepTime < time.Duration(120)*time.Second {
106+
time.Sleep(sleepTime)
107+
L().Errorf("sendMessage: %v, sleeping for %s, retry: %d", err, sleepTime, retries)
108+
} else {
109+
L().Errorf("sendMessage: %v, sleep duration is more than 120 seconds, giving up!!!", err)
110+
break
111+
}
95112
}
96113
}
97114
return msg
@@ -112,6 +129,13 @@ func isEditMessageContentSameError(err error) bool {
112129
return strings.Contains(err.Error(), "specified new message content and reply markup are exactly the same as a current content and reply markup of the message")
113130
}
114131

132+
func isMessageFloodWaitError(err error) bool {
133+
if err == nil {
134+
return false
135+
}
136+
return strings.Contains(err.Error(), "retry after ")
137+
}
138+
115139
func isMessageNotFoundError(err error) bool {
116140
if err == nil {
117141
return false
@@ -142,13 +166,34 @@ func EditMessageImpl(b *gotgbot.Bot, messageText string, message *gotgbot.Messag
142166
if err == nil {
143167
break
144168
} else {
145-
if isEditMessageContentSameError(err) || isMessageNotFoundError(err) { //ignore this error
169+
if isEditMessageContentSameError(err) { //ignore this error
170+
break
171+
}
172+
if isMessageNotFoundError(err) {
173+
L().Infof("message to edit not found: %v, dropping from StatusManager.", message.MessageId)
174+
DeleteStatusMessage(b, message)
146175
break
147176
}
177+
var sleepTime time.Duration
148178
retries += 1
149-
sleepTime := time.Duration(SleepMultiplier*float32(retries)) * time.Second
150-
L().Errorf("editMessage: %v, sleeping for %s, retry: %d", err, sleepTime, retries)
151-
time.Sleep(sleepTime)
179+
if isMessageFloodWaitError(err) {
180+
L().Infof("flood wait error detected: %v", err)
181+
parsedDuration, err := utils.ParseMessageFloodWaitDuration(err)
182+
if err != nil {
183+
L().Errorf("error while parsing flood wait sleep duration: %v", err)
184+
} else {
185+
sleepTime = time.Duration(parsedDuration) * time.Second
186+
}
187+
} else {
188+
sleepTime = time.Duration(SleepMultiplier*float32(retries)) * time.Second
189+
}
190+
if sleepTime < time.Duration(120)*time.Second {
191+
time.Sleep(sleepTime)
192+
L().Errorf("editMessage: %v, sleeping for %s, retry: %d", err, sleepTime, retries)
193+
} else {
194+
L().Errorf("editMessage: %v, sleep duration is more than 120 seconds, giving up!!!", err)
195+
break
196+
}
152197
}
153198
}
154199
return msg
@@ -177,6 +222,11 @@ func DeleteAllMessages(b *gotgbot.Bot) {
177222
}
178223
}
179224

225+
func DeleteStatusMessage(b *gotgbot.Bot, message *gotgbot.Message) {
226+
DeleteMessage(b, message)
227+
DeleteMessageByChatId(message.Chat.Id)
228+
}
229+
180230
func GetCpuUsage() string {
181231
out := ""
182232
data, err := cpu.Percent(10*time.Millisecond, false)
@@ -317,6 +367,10 @@ func SendStatusMessage(b *gotgbot.Bot, message *gotgbot.Message, deleteCommandMe
317367
}
318368
newMsg.Date = 0
319369
AddStatusMessage(newMsg)
370+
duration := utils.GetStatusMessageAutoDeleteTime()
371+
if duration > 0 {
372+
AutoDeleteMessages(b, time.Duration(duration)*time.Second, newMsg)
373+
}
320374
return nil
321375
}
322376
SenderQueue.QueueMessage(message.Chat.Id, MessageSendItem{

utils/utils.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package utils
33
import (
44
"encoding/json"
55
"fmt"
6-
"github.com/dustin/go-humanize"
76
"io"
87
"io/ioutil"
98
"log"
@@ -20,6 +19,8 @@ import (
2019
"strings"
2120
"time"
2221

22+
"github.com/dustin/go-humanize"
23+
2324
"github.com/gabriel-vasile/mimetype"
2425
"github.com/lithammer/shortuuid"
2526
)
@@ -88,6 +89,7 @@ type ConfigJson struct {
8889
ZipStreamerURL string `json:"zip_streamer_url"`
8990
SpamFilterMessagesPerDuration int `json:"spam_filter_messages_per_duration"`
9091
SpamFilterDurationValue int `json:"spam_filter_duration_value"`
92+
StatusMessageAutoDeleteTime int `json:"status_message_auto_delete_time"`
9193
}
9294

9395
var Config *ConfigJson = InitConfig()
@@ -744,3 +746,16 @@ func TrimString(text string) string {
744746
}
745747
return text
746748
}
749+
750+
func GetStatusMessageAutoDeleteTime() int {
751+
return Config.StatusMessageAutoDeleteTime
752+
}
753+
754+
func ParseMessageFloodWaitDuration(err error) (int, error) {
755+
if err == nil {
756+
return -1, fmt.Errorf("error cannot be nil for this function")
757+
}
758+
valueInString := strings.SplitN(err.Error(), "retry after ", 2)[1]
759+
value, err := strconv.Atoi(valueInString)
760+
return value, err
761+
}

0 commit comments

Comments
 (0)