616c6b1c62
Release Docker multi arch / docker (push) Has been cancelled
Test Install Script / Test Script Syntax (push) Has been cancelled
Test Install Script / Test on almalinux-10 (default) (push) Has been cancelled
Test Install Script / Test on almalinux-10 (root) (push) Has been cancelled
Test Install Script / Test on almalinux-8 (default) (push) Has been cancelled
Test Install Script / Test on almalinux-8 (root) (push) Has been cancelled
Test Install Script / Test on almalinux-9 (default) (push) Has been cancelled
Test Install Script / Test on almalinux-9 (root) (push) Has been cancelled
Test Install Script / Test on amazonlinux-2 (default) (push) Has been cancelled
Test Install Script / Test on amazonlinux-2 (root) (push) Has been cancelled
Test Install Script / Test on debian-11 (default) (push) Has been cancelled
Test Install Script / Test on debian-11 (root) (push) Has been cancelled
Test Install Script / Test on debian-12 (default) (push) Has been cancelled
Test Install Script / Test on debian-12 (root) (push) Has been cancelled
Test Install Script / Test on debian-13 (default) (push) Has been cancelled
Test Install Script / Test on debian-13 (root) (push) Has been cancelled
Test Install Script / Test on fedora-latest (default) (push) Has been cancelled
Test Install Script / Test on fedora-latest (root) (push) Has been cancelled
Test Install Script / Test on rocky-10 (default) (push) Has been cancelled
Test Install Script / Test on rocky-10 (root) (push) Has been cancelled
Test Install Script / Test on rocky-8 (default) (push) Has been cancelled
Test Install Script / Test on rocky-8 (root) (push) Has been cancelled
Test Install Script / Test on rocky-9 (default) (push) Has been cancelled
Test Install Script / Test on rocky-9 (root) (push) Has been cancelled
Test Install Script / Test on ubuntu-22.04 (default) (push) Has been cancelled
Test Install Script / Test on ubuntu-22.04 (root) (push) Has been cancelled
Test Install Script / Test on ubuntu-24.04 (default) (push) Has been cancelled
Test Install Script / Test on ubuntu-24.04 (root) (push) Has been cancelled
119 lines
2.4 KiB
Go
119 lines
2.4 KiB
Go
package tgbot
|
|
|
|
import (
|
|
"encoding/json"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"strings"
|
|
"sync"
|
|
"time"
|
|
|
|
tele "gopkg.in/telebot.v4"
|
|
"server/settings"
|
|
)
|
|
|
|
const (
|
|
LangRU = "ru"
|
|
LangEN = "en"
|
|
saveUserLangsWait = 2 * time.Second
|
|
)
|
|
|
|
var (
|
|
userLang = make(map[int64]string)
|
|
userLangMu sync.RWMutex
|
|
saveUserLangsMu sync.Mutex
|
|
saveUserLangsTimer *time.Timer
|
|
)
|
|
|
|
func getUserLang(userID int64) string {
|
|
userLangMu.RLock()
|
|
defer userLangMu.RUnlock()
|
|
if lang, ok := userLang[userID]; ok {
|
|
return lang
|
|
}
|
|
return LangRU
|
|
}
|
|
|
|
func setUserLang(userID int64, lang string) {
|
|
if lang != LangRU && lang != LangEN {
|
|
return
|
|
}
|
|
userLangMu.Lock()
|
|
userLang[userID] = lang
|
|
userLangMu.Unlock()
|
|
scheduleSaveUserLangs()
|
|
}
|
|
|
|
func scheduleSaveUserLangs() {
|
|
saveUserLangsMu.Lock()
|
|
defer saveUserLangsMu.Unlock()
|
|
if saveUserLangsTimer != nil {
|
|
saveUserLangsTimer.Stop()
|
|
}
|
|
saveUserLangsTimer = time.AfterFunc(saveUserLangsWait, func() {
|
|
saveUserLangsMu.Lock()
|
|
saveUserLangsTimer = nil
|
|
saveUserLangsMu.Unlock()
|
|
saveUserLangs()
|
|
})
|
|
}
|
|
|
|
func loadUserLangs() {
|
|
fn := filepath.Join(settings.Path, "tg_langs.json")
|
|
buf, err := os.ReadFile(fn)
|
|
if err != nil {
|
|
return
|
|
}
|
|
var m map[string]string
|
|
if err := json.Unmarshal(buf, &m); err != nil {
|
|
return
|
|
}
|
|
userLangMu.Lock()
|
|
for k, v := range m {
|
|
if v == LangRU || v == LangEN {
|
|
if id, parseErr := strconv.ParseInt(k, 10, 64); parseErr == nil {
|
|
userLang[id] = v
|
|
}
|
|
}
|
|
}
|
|
userLangMu.Unlock()
|
|
}
|
|
|
|
func saveUserLangs() {
|
|
userLangMu.RLock()
|
|
m := make(map[string]string)
|
|
for k, v := range userLang {
|
|
m[strconv.FormatInt(k, 10)] = v
|
|
}
|
|
userLangMu.RUnlock()
|
|
buf, err := json.Marshal(m)
|
|
if err != nil {
|
|
return
|
|
}
|
|
fn := filepath.Join(settings.Path, "tg_langs.json")
|
|
_ = os.WriteFile(fn, buf, 0o600)
|
|
}
|
|
|
|
func cmdLang(c tele.Context) error {
|
|
uid := c.Sender().ID
|
|
args := c.Args()
|
|
if len(args) == 0 {
|
|
lang := getUserLang(uid)
|
|
if lang == LangEN {
|
|
return c.Send(tr(uid, "lang_current_en") + "\n/lang RU — " + tr(uid, "lang_switch_ru"))
|
|
}
|
|
return c.Send(tr(uid, "lang_current_ru") + "\n/lang EN — " + tr(uid, "lang_switch_en"))
|
|
}
|
|
lang := strings.ToUpper(strings.TrimSpace(args[0]))
|
|
if lang == "EN" {
|
|
setUserLang(uid, LangEN)
|
|
return c.Send(tr(uid, "lang_set_en"))
|
|
}
|
|
if lang == "RU" || lang == "РУ" {
|
|
setUserLang(uid, LangRU)
|
|
return c.Send(tr(uid, "lang_set"))
|
|
}
|
|
return c.Send(tr(uid, "lang_usage"))
|
|
}
|