🔀 Merge branch 'release/1.2' into develop

This commit is contained in:
Maxim Lebedev 2018-01-20 03:00:24 +05:00
commit 88dc6f7ff5
No known key found for this signature in database
GPG Key ID: F8978F46FF0FFA4F
31 changed files with 344 additions and 354 deletions

31
actions.go Executable file
View File

@ -0,0 +1,31 @@
package main
import (
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
// actions function check Message update on commands, sended stickers or other user stuff
func actions(msg *tg.Message) {
state, err := dbGetUserState(msg.From.ID)
errCheck(err)
log.Ln("state:", state)
switch state {
case stateAddSticker:
actionAdd(msg, false)
case stateAddPack:
actionAdd(msg, true)
case stateDeleteSticker:
actionDelete(msg, false)
case stateDeletePack:
actionDelete(msg, true)
case stateReset:
actionReset(msg)
default:
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
actionError(msg)
}
}

80
add.go
View File

@ -1,16 +1,17 @@
package main
import (
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
func commandAdd(msg *tg.Message, pack bool) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply := tg.NewMessage(msg.Chat.ID, T("reply_add_sticker"))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getCancelButton(T)
@ -31,21 +32,44 @@ func commandAdd(msg *tg.Message, pack bool) {
}
func actionAdd(msg *tg.Message, pack bool) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
if msg.Sticker == nil {
return
}
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply := tg.NewMessage(msg.Chat.ID, T("success_add_sticker"))
reply.ParseMode = tg.ModeMarkdown
switch {
case pack && msg.Sticker.SetName == "":
reply.Text = T("error_empty_add_pack", map[string]interface{}{
"AddStickerCommand": cmdAddSticker,
})
case pack && msg.Sticker.SetName != "":
set, err := bot.GetStickerSet(msg.Sticker.SetName)
if !pack {
var exist bool
sticker := msg.Sticker
exist, err = dbAddSticker(
msg.From.ID, sticker.SetName, sticker.FileID, sticker.Emoji,
)
errCheck(err)
if exist {
reply.Text = T("error_already_add_sticker")
}
reply.ReplyMarkup = getCancelButton(T)
_, err = bot.SendMessage(reply)
errCheck(err)
return
}
reply.Text = T("error_empty_add_pack", map[string]interface{}{
"AddStickerCommand": cmdAddSticker,
})
if msg.Sticker.SetName != "" {
var set *tg.StickerSet
set, err = bot.GetStickerSet(msg.Sticker.SetName)
errCheck(err)
log.Ln("SetTitle:", set.Title)
@ -55,48 +79,26 @@ func actionAdd(msg *tg.Message, pack bool) {
allExists := true
for _, sticker := range set.Stickers {
exists, err := dbAddSticker(
msg.From.ID,
sticker.SetName,
sticker.FileID,
sticker.Emoji,
var exist bool
exist, err = dbAddSticker(
msg.From.ID, sticker.SetName, sticker.FileID, sticker.Emoji,
)
errCheck(err)
if !exists {
if !exist {
allExists = false
}
}
log.Ln("All exists?", allExists)
if allExists {
reply.Text = T("error_already_add_pack", map[string]interface{}{
"SetTitle": set.Title,
})
} else {
reply.ReplyMarkup = getCancelButton(T)
}
default:
exists, err := dbAddSticker(
msg.From.ID,
msg.Sticker.SetName,
msg.Sticker.FileID,
msg.Sticker.Emoji,
)
errCheck(err)
if exists {
reply.Text = T("error_already_add_sticker")
}
if msg.Sticker.Emoji == "" {
msg.Sticker.Emoji = " "
}
reply.ReplyMarkup = getCancelButton(T)
}
reply.ReplyMarkup = getCancelButton(T)
_, err = bot.SendMessage(reply)
errCheck(err)
}

View File

@ -1,16 +1,17 @@
package main
import tg "github.com/toby3d/telegram" // My Telegram bindings
import tg "github.com/toby3d/telegram"
func commandCancel(msg *tg.Message) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
state, err := dbGetUserState(msg.From.ID)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
var text string
switch state {
case stateAddSticker:

View File

@ -3,8 +3,8 @@ package main
import (
"strings"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
const (
@ -19,7 +19,7 @@ const (
)
func commands(msg *tg.Message) {
log.Ln("Received a", msg.Command(), "command")
log.Ln("command:", msg.Command())
switch strings.ToLower(msg.Command()) {
case strings.ToLower(cmdStart):
commandStart(msg)

View File

@ -5,8 +5,8 @@ import (
"strconv"
"strings"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
"github.com/tidwall/buntdb" // Redis-like database
log "github.com/kirillDanshin/dlog"
"github.com/tidwall/buntdb"
)
const (
@ -18,9 +18,6 @@ const (
stateReset = "reset"
setUploaded = "?"
patternUsers = "users"
patternUserSets = "user_sets"
)
var db *buntdb.DB
@ -31,22 +28,6 @@ func dbInit() {
db, err = buntdb.Open("stickers.db")
errCheck(err)
log.Ln("Creating users index...")
err = db.CreateIndex(
patternUsers, // name
"user:*", // pattern
buntdb.IndexString, // options
)
errCheck(err)
log.Ln("Creating user_sets index...")
err = db.CreateIndex(
patternUserSets, // name
"user:*:set:*", // pattern
buntdb.IndexString, // options
)
errCheck(err)
select {}
}
@ -76,11 +57,7 @@ func dbGetUsers() ([]int, error) {
func dbChangeUserState(userID int, state string) error {
log.Ln("Trying to change", userID, "state to", state)
return db.Update(func(tx *buntdb.Tx) error {
_, _, err := tx.Set(
fmt.Sprint("user:", userID, ":state"), // key
state, // val
nil, // options
)
_, _, err := tx.Set(fmt.Sprint("user:", userID, ":state"), state, nil)
return err
})
}
@ -97,7 +74,7 @@ func dbGetUserState(userID int) (string, error) {
switch err {
case buntdb.ErrNotFound:
log.Ln(userID, "not found, create new one")
if err := dbChangeUserState(userID, stateNone); err != nil {
if err = dbChangeUserState(userID, stateNone); err != nil {
return state, err
}
}
@ -138,7 +115,9 @@ func dbDeleteSticker(userID int, setName, fileID string) (bool, error) {
}
err := db.Update(func(tx *buntdb.Tx) error {
_, err := tx.Delete(fmt.Sprint("user:", userID, ":set:", setName, ":sticker:", fileID))
_, err := tx.Delete(
fmt.Sprint("user:", userID, ":set:", setName, ":sticker:", fileID),
)
return err
})
@ -174,7 +153,8 @@ func dbDeletePack(userID int, setName string) (bool, error) {
}
for _, fileID := range fileIDs {
notExist, err := dbDeleteSticker(userID, setName, fileID)
var notExist bool
notExist, err = dbDeleteSticker(userID, setName, fileID)
if err != nil {
return notExist, err
}
@ -194,7 +174,7 @@ func dbResetUserStickers(userID int) error {
return db.Update(func(tx *buntdb.Tx) error {
var keys []string
if err := tx.AscendKeys(
patternUserSets, // index
fmt.Sprint("user:", userID, ":set:*"), // index
func(key, val string) bool { // iterator
subKeys := strings.Split(key, ":")
if subKeys[1] == strconv.Itoa(userID) {
@ -233,7 +213,6 @@ func dbGetUserStickers(userID, offset int, query string) ([]string, int, error)
}
total++
if count >= 51 {
return true
}
@ -242,8 +221,7 @@ func dbGetUserStickers(userID, offset int, query string) ([]string, int, error)
return true
}
if query != "" &&
query != val {
if query != "" && !strings.Contains(query, val) {
return true
}

View File

@ -1,19 +1,20 @@
package main
import (
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
func commandDelete(msg *tg.Message, pack bool) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, total, err := dbGetUserStickers(msg.From.ID, 0, "")
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
if total <= 0 {
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
@ -41,21 +42,35 @@ func commandDelete(msg *tg.Message, pack bool) {
_, err = bot.SendMessage(reply)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply = tg.NewMessage(msg.Chat.ID, T("reply_switch_button"))
reply.ReplyMarkup = getSwitchButton(T)
_, err = bot.SendMessage(reply)
errCheck(err)
}
func actionDelete(msg *tg.Message, pack bool) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
if msg.Sticker == nil {
return
}
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply := tg.NewMessage(msg.Chat.ID, T("success_del_sticker"))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getCancelButton(T)
var notExist bool
if pack {
set, err := bot.GetStickerSet(msg.Sticker.SetName)
var set *tg.StickerSet
set, err = bot.GetStickerSet(msg.Sticker.SetName)
errCheck(err)
log.Ln("SetName:", set.Title)

25
error.go Normal file
View File

@ -0,0 +1,25 @@
package main
import tg "github.com/toby3d/telegram"
func actionError(msg *tg.Message) {
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply := tg.NewMessage(
msg.Chat.ID, T("error_unknown", map[string]interface{}{
"AddStickerCommand": cmdAddSticker,
"AddPackCommand": cmdAddPack,
"DeleteStickerCommand": cmdDeleteSticker,
"DeletePackCommand": cmdDeletePack,
}),
)
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getMenuKeyboard(T)
_, err = bot.SendMessage(reply)
errCheck(err)
}

View File

@ -3,8 +3,8 @@ package main
import (
"fmt"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
// allowedUpdates is a value for parameter of updates configuration

11
help.go
View File

@ -1,14 +1,15 @@
package main
import tg "github.com/toby3d/telegram" // My Telegram bindings
import tg "github.com/toby3d/telegram"
func commandHelp(msg *tg.Message) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
err := dbChangeUserState(msg.From.ID, stateNone)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
T, err := switchLocale(msg.From.LanguageCode)
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
reply := tg.NewMessage(

View File

@ -3,8 +3,23 @@ package main
import (
"github.com/nicksnyder/go-i18n/i18n"
tg "github.com/toby3d/telegram"
"golang.org/x/text/runes"
"golang.org/x/text/transform"
)
var bannedSkins = []rune{127995, 127996, 127997, 127998, 127999}
var skinRemover = runes.Remove(runes.Predicate(
func(r rune) bool {
for _, skin := range bannedSkins {
if r == skin {
return true
}
}
return false
},
))
func getMenuKeyboard(T i18n.TranslateFunc) *tg.ReplyKeyboardMarkup {
return tg.NewReplyKeyboardMarkup(
tg.NewReplyKeyboardRow(
@ -28,3 +43,16 @@ func getCancelButton(T i18n.TranslateFunc) *tg.ReplyKeyboardMarkup {
),
)
}
func getSwitchButton(T i18n.TranslateFunc) *tg.InlineKeyboardMarkup {
return tg.NewInlineKeyboardMarkup(
tg.NewInlineKeyboardRow(
tg.NewInlineKeyboardButtonSwitchSelf(T("button_inline_select"), " "),
),
)
}
func fixEmoji(raw string) (string, error) {
result, _, err := transform.String(skinRemover, raw)
return result, err
}

View File

@ -4,19 +4,19 @@ button_add_sticker:
other: Add sticker
button_cancel:
other: ❌ Cancel
button_del:
other: Select sticker for remove
button_del_pack:
other: "\U0001F5D1 Delete pack"
button_del_sticker:
other: "\U0001F5D1 Delete sticker"
button_inline_add:
one: You have {{.Count}} sticker. Add one more?
other: You have {{.Count}} stickers. Add one more?
button_inline_empty:
other: Your pack is empty
button_inline_nothing:
other: Not found stickers for {{.Query}}, add one?
other: Not found stickers for {{.Query}}
button_inline_search:
one: You have {{.Count}} sticker
other: You have {{.Count}} stickers
button_inline_select:
other: Select sticker
button_reset:
other: "\U0001F525 Reset pack"
button_share:
@ -37,7 +37,9 @@ error_already_add_pack:
other: All stickers from *{{.SetTitle}}* pack is already in yours.
error_already_add_sticker:
other: This sticker is already in your pack.
error_already_del:
error_already_del_pack:
other: Maybe this pack is already removed from yours.
error_already_del_sticker:
other: Maybe this sticker is already removed from your pack.
error_already_reset:
other: There is nothing to reset, pack is already empty.
@ -52,14 +54,8 @@ error_unknown:
other: |-
I do not know what to do with this sticker.
Please run /{{.AddStickerCommand}}, /{{.AddPackCommand}}, /{{.DeleteStickerCommand}} or /{{.DeletePackCommand}} command first.
meta_key_phrase:
key_phrase:
other: Yes, I am totally sure.
meta_reset_1:
other: Wait. Who are you?
meta_reset_2:
other: What are you doing here?
meta_reset_3:
other: What am I doing here?
reply_add_pack:
other: Send an existing stickers from any other packs to add the entire packs to
yourself.
@ -70,7 +66,7 @@ reply_del_pack:
reply_del_sticker:
other: Send an existing stickers from your pack for removing it.
reply_help:
other: |-
other: |
/{{.AddStickerCommand}} - add a single sticker to your pack
/{{.AddPackCommand}} - add a full other pack to your pack
/{{.DeleteStickerCommand}} - remove a single sticker from your pack
@ -90,6 +86,9 @@ reply_start:
Hello, I'm the [@{{.Username}}](tg://user?id={{.ID}})!
I can create your personal pack with stickers from others packs.
Without limits and installing. In any chat. For free.
reply_switch_button:
other: This button will help you quickly call your pack to select the sticker you
want.
success_add_pack:
other: The sticker pack *{{.SetTitle}}* was successfully added to yours!
success_add_sticker:

View File

@ -1,12 +1,12 @@
button_inline_empty:
other: Your pack is empty
button_inline_nothing:
other: Not found stickers for {{.Query}}, add one?
button_inline_add:
one: You have {{.Count}} sticker. Add one more?
other: You have {{.Count}} stickers. Add one more?
button_del:
other: Select sticker for remove
other: Not found stickers for {{.Query}}
button_inline_search:
one: You have {{.Count}} sticker
other: You have {{.Count}} stickers
button_inline_select:
other: Select sticker
button_share:
other: Use your stickers pack!
button_add_sticker:

View File

@ -2,8 +2,10 @@ error_already_add_sticker:
other: This sticker is already in your pack.
error_already_add_pack:
other: All stickers from *{{.SetTitle}}* pack is already in yours.
error_already_del:
error_already_del_sticker:
other: Maybe this sticker is already removed from your pack.
error_already_del_pack:
other: Maybe this pack is already removed from yours.
error_already_reset:
other: There is nothing to reset, pack is already empty.
error_reset_phrase:

View File

@ -1,8 +0,0 @@
meta_key_phrase:
other: Yes, I am totally sure.
meta_reset_1:
other: Wait. Who are you?
meta_reset_2:
other: What are you doing here?
meta_reset_3:
other: What am I doing here?

View File

@ -26,4 +26,6 @@ reply_help:
/{{.ResetCommand}} - remove all stickers from your pack
/{{.CancelCommand}} - cancel the current operation
To view and send stickers from your pack, just type `@{{.Username}}` (and space) in any chat.
To view and send stickers from your pack, just type `@{{.Username}}` (and space) in any chat.
reply_switch_button:
other: This button will help you quickly call your pack to select the sticker you want.

2
i18n/en/en.yaml Normal file
View File

@ -0,0 +1,2 @@
key_phrase:
other: Yes, I am totally sure.

View File

@ -4,21 +4,21 @@ button_add_sticker:
other: Добавить стикер
button_cancel:
other: ❌ Отменить
button_del:
other: Выбрать стикер для удаления
button_del_pack:
other: "\U0001F5D1 Удалить набор"
button_del_sticker:
other: "\U0001F5D1 Удалить стикер"
button_inline_add:
few: У тебя {{.Count}} стикеров. Добавить ещё один?
many: У тебя {{.Count}} стикеров. Добавить ещё один?
one: У тебя {{.Count}} стикер. Добавить ещё один?
other: У тебя {{.Count}} стикеров. Добавить ещё один?
button_inline_empty:
other: Твой набор пуст
button_inline_nothing:
other: Нет стикеров с {{.Query}}, добавить один?
other: Не найдены стикеры для {{.Query}}
button_inline_search:
few: У тебя {{.Count}} стикера
many: У тебя {{.Count}} стикеров
one: У тебя {{.Count}} стикер
other: У тебя {{.Count}} стикеров
button_inline_select:
other: Выбрать стикер
button_reset:
other: "\U0001F525 Сбросить набор"
button_share:
@ -39,7 +39,9 @@ error_already_add_pack:
other: Все стикеры *{{.SetTitle}}* уже в твоём наборе.
error_already_add_sticker:
other: Этот стикер уже в твоём наборе.
error_already_del:
error_already_del_pack:
other: Вероятно этот набор уже удалён из твоего.
error_already_del_sticker:
other: Вероятно этот стикер уже удалён из твоего набора.
error_already_reset:
other: Нечего сбрасывать, набор уже пуст.
@ -53,14 +55,8 @@ error_unknown:
other: |-
Я понятия не имею что делать с этим стикером.
Пожалуйста, сначала примени /{{.AddStickerCommand}}, /{{.AddPackCommand}}, /{{.DeleteStickerCommand}} или /{{.DeletePackCommand}}.
meta_key_phrase:
key_phrase:
other: Да, я абсолютно уверен.
meta_reset_1:
other: Подожди. Кто ты?
meta_reset_2:
other: Что ты здесь делаешь?
meta_reset_3:
other: Что Я здесь делаю?
reply_add_pack:
other: Пришли стикеры из любых других наборов чтобы целиком добавить их наборы в
свой.
@ -71,7 +67,7 @@ reply_del_pack:
reply_del_sticker:
other: Пришли стикер из своего набора чтобы удалить его.
reply_help:
other: |-
other: |
/{{.AddStickerCommand}} - по-одному добавляет стикеры в твой набор
/{{.AddPackCommand}} - добавляет сразу весь набор в твой
/{{.DeleteStickerCommand}} - по-одному удаляет стикер из твоего набора
@ -91,6 +87,8 @@ reply_start:
Привет, я [@{{.Username}}](tg://user?id={{.ID}})!
Я могу создать твой персональный набор стикеров из других наборов.
Без ограничений и установки. В любых чатах. Бесплатно.
reply_switch_button:
other: Эта кнопка поможет тебе быстро вызвать твой набор для выбора нужного стикера.
success_add_pack:
other: Набор *{{.SetTitle}}* успешно добавлен в твой!
success_add_sticker:

View File

@ -1,14 +1,14 @@
button_inline_empty:
other: Твой набор пуст
button_inline_nothing:
other: Нет стикеров с {{.Query}}, добавить один?
button_inline_add:
few: У тебя {{.Count}} стикеров. Добавить ещё один?
one: У тебя {{.Count}} стикер. Добавить ещё один?
many: У тебя {{.Count}} стикеров. Добавить ещё один?
other: У тебя {{.Count}} стикеров. Добавить ещё один?
button_del:
other: Выбрать стикер для удаления
other: Не найдены стикеры для {{.Query}}
button_inline_search:
few: У тебя {{.Count}} стикера
one: У тебя {{.Count}} стикер
many: У тебя {{.Count}} стикеров
other: У тебя {{.Count}} стикеров
button_inline_select:
other: Выбрать стикер
button_share:
other: Воспользоваться твоим набором!
button_add_sticker:

View File

@ -2,8 +2,10 @@ error_already_add_sticker:
other: Этот стикер уже в твоём наборе.
error_already_add_pack:
other: Все стикеры *{{.SetTitle}}* уже в твоём наборе.
error_already_del:
error_already_del_sticker:
other: Вероятно этот стикер уже удалён из твоего набора.
error_already_del_pack:
other: Вероятно этот набор уже удалён из твоего.
error_already_reset:
other: Нечего сбрасывать, набор уже пуст.
error_reset_phrase:

View File

@ -1,8 +0,0 @@
meta_key_phrase:
other: Да, я абсолютно уверен.
meta_reset_1:
other: Подожди. Кто ты?
meta_reset_2:
other: Что ты здесь делаешь?
meta_reset_3:
other: Что Я здесь делаю?

View File

@ -26,4 +26,6 @@ reply_help:
/{{.ResetCommand}} - удаляет все стикеры из твоего набора
/{{.CancelCommand}} - отменяет текущую операцию
Для просмотра и отправки стикеров из твоего набора просто набери `@{{.Username}}` (и пробел) в любом чате.
Для просмотра и отправки стикеров из твоего набора просто набери `@{{.Username}}` (и пробел) в любом чате.
reply_switch_button:
other: Эта кнопка поможет тебе быстро вызвать твой набор для выбора нужного стикера.

2
i18n/ru/ru.yaml Normal file
View File

@ -0,0 +1,2 @@
key_phrase:
other: Да, я абсолютно уверен.

View File

@ -6,9 +6,9 @@ import (
"path/filepath"
"strings"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
"github.com/nicksnyder/go-i18n/i18n" // Internationalization and localization
"github.com/olebedev/config" // Easy configuration file parsing
log "github.com/kirillDanshin/dlog"
"github.com/nicksnyder/go-i18n/i18n"
"github.com/olebedev/config"
)
var (

28
main.go
View File

@ -1,8 +1,8 @@
package main
import (
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
// bot is general structure of the bot
@ -23,26 +23,16 @@ func main() {
for update := range getUpdatesChannel() {
switch {
case update.InlineQuery != nil:
// Just don't check same updates
log.D(update.InlineQuery.Query)
if len(update.InlineQuery.Query) > 25 {
continue
}
inlineQuery(update.InlineQuery)
log.D(update.InlineQuery)
updateInlineQuery(update.InlineQuery)
case update.Message != nil:
if bot.IsMessageFromMe(update.Message) ||
bot.IsForwardFromMe(update.Message) {
log.Ln("Ignore message update")
return
}
messages(update.Message)
log.D(update.Message)
updateMessage(update.Message)
case update.ChannelPost != nil:
channelPost(update.ChannelPost)
log.D(update.ChannelPost)
updateChannelPost(update.ChannelPost)
default:
log.Ln("Get unsupported update")
continue
log.D(update)
}
}

93
messages.go Executable file → Normal file
View File

@ -1,98 +1,29 @@
package main
import (
// log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
"strings"
tg "github.com/toby3d/telegram"
)
// message function check Message update on commands, sended stickers or other
// user stuff
func messages(msg *tg.Message) {
if msg.IsCommand() {
commands(msg)
return
}
state, err := dbGetUserState(msg.From.ID)
errCheck(err)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
switch msg.Text {
case T("button_add_sticker"):
switch {
case strings.EqualFold(msg.Text, T("button_add_sticker")):
commandAdd(msg, false)
return
case T("button_add_pack"):
case strings.EqualFold(msg.Text, T("button_add_pack")):
commandAdd(msg, true)
return
case T("button_del_sticker"):
case strings.EqualFold(msg.Text, T("button_del_sticker")):
commandDelete(msg, false)
return
case T("button_del_pack"):
case strings.EqualFold(msg.Text, T("button_del_pack")):
commandDelete(msg, true)
return
case T("button_reset"):
case strings.EqualFold(msg.Text, T("button_reset")):
commandReset(msg)
return
case T("button_cancel"):
case strings.EqualFold(msg.Text, T("button_cancel")):
commandCancel(msg)
return
case strings.EqualFold(msg.Text, T("meta_key_phrase")):
actions(msg)
}
switch state {
case stateAddSticker:
if msg.Sticker == nil {
return
}
actionAdd(msg, false)
return
case stateAddPack:
if msg.Sticker == nil {
return
}
actionAdd(msg, true)
return
case stateDeleteSticker:
if msg.Sticker == nil {
return
}
actionDelete(msg, false)
return
case stateDeletePack:
if msg.Sticker == nil {
return
}
actionDelete(msg, true)
return
case stateReset:
actionReset(msg)
return
case stateNone:
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
reply := tg.NewMessage(
msg.Chat.ID,
T("error_unknown", map[string]interface{}{
"AddStickerCommand": cmdAddSticker,
"AddPackCommand": cmdAddPack,
"DeleteStickerCommand": cmdDeleteSticker,
"DeletePackCommand": cmdDeletePack,
}))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getMenuKeyboard(T)
_, err = bot.SendMessage(reply)
errCheck(err)
return
}
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
messages(msg)
}

View File

@ -1,21 +1,21 @@
package main
import (
"fmt"
"time"
"strings"
tg "github.com/toby3d/telegram" // My Telegram bindings
tg "github.com/toby3d/telegram"
)
func commandReset(msg *tg.Message) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
_, total, err := dbGetUserStickers(msg.From.ID, 0, "")
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
if total <= 0 {
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
@ -23,7 +23,6 @@ func commandReset(msg *tg.Message) {
reply := tg.NewMessage(msg.Chat.ID, T("error_already_reset"))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getMenuKeyboard(T)
_, err = bot.SendMessage(reply)
errCheck(err)
return
@ -32,33 +31,30 @@ func commandReset(msg *tg.Message) {
err = dbChangeUserState(msg.From.ID, stateReset)
errCheck(err)
reply := tg.NewMessage(
msg.Chat.ID,
T("reply_reset", map[string]interface{}{
"KeyPhrase": T("meta_key_phrase"),
"CancelCommand": cmdCancel,
}))
reply := tg.NewMessage(msg.Chat.ID, T("reply_reset", map[string]interface{}{
"KeyPhrase": T("meta_key_phrase"),
"CancelCommand": cmdCancel,
}))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getCancelButton(T)
_, err = bot.SendMessage(reply)
errCheck(err)
}
func actionReset(msg *tg.Message) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
err := dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
if msg.Text != T("meta_key_phrase") {
err = dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
if !strings.EqualFold(msg.Text, T("meta_key_phrase")) {
reply := tg.NewMessage(msg.Chat.ID, T("error_reset_phrase"))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getMenuKeyboard(T)
_, err = bot.SendMessage(reply)
errCheck(err)
return
@ -69,22 +65,7 @@ func actionReset(msg *tg.Message) {
reply := tg.NewMessage(msg.Chat.ID, T("success_reset"))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = tg.NewReplyKeyboardRemove(false)
reply.ReplyMarkup = getMenuKeyboard(T)
_, err = bot.SendMessage(reply)
errCheck(err)
for i := 1; i <= 3; i++ {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
text := T(fmt.Sprint("meta_reset_", i))
time.Sleep(time.Minute * time.Duration(len(text)) / 1000)
reply = tg.NewMessage(msg.Chat.ID, text)
reply.ParseMode = tg.ModeMarkdown
_, err = bot.SendMessage(reply)
errCheck(err)
}
}

View File

@ -3,20 +3,21 @@ package main
import (
"strings"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
func commandStart(msg *tg.Message) {
bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
err := dbChangeUserState(msg.From.ID, stateNone)
errCheck(err)
_, err = bot.SendChatAction(msg.Chat.ID, tg.ActionTyping)
errCheck(err)
if msg.HasArgument() {
log.Ln("Received a", msg.Command(), "command with", msg.CommandArgument(), "argument")
if strings.ToLower(msg.CommandArgument()) == strings.ToLower(cmdAddSticker) {
commandAdd(msg, false)
if strings.ToLower(msg.CommandArgument()) == strings.ToLower(cmdHelp) {
commandHelp(msg)
return
}
}
@ -24,12 +25,10 @@ func commandStart(msg *tg.Message) {
T, err := switchLocale(msg.From.LanguageCode)
errCheck(err)
reply := tg.NewMessage(
msg.Chat.ID, T("reply_start", map[string]interface{}{
"Username": bot.Self.Username,
"ID": bot.Self.ID,
}),
)
reply := tg.NewMessage(msg.Chat.ID, T("reply_start", map[string]interface{}{
"Username": bot.Self.Username,
"ID": bot.Self.ID,
}))
reply.ParseMode = tg.ModeMarkdown
reply.ReplyMarkup = getMenuKeyboard(T)

View File

@ -1,15 +1,13 @@
package main
import (
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
"github.com/nicksnyder/go-i18n/i18n" // Internationalization and localization
log "github.com/kirillDanshin/dlog"
"github.com/nicksnyder/go-i18n/i18n"
)
const langFallback = "en"
func switchLocale(langCode string) (T i18n.TranslateFunc, err error) {
func switchLocale(langCode string) (i18n.TranslateFunc, error) {
log.Ln("Check", langCode, "localization")
T, err = i18n.Tfunc(langCode, langFallback)
errCheck(err)
return
return i18n.Tfunc(langCode, langFallback)
}

View File

@ -3,11 +3,11 @@ package main
import (
"time"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
func channelPost(post *tg.Message) {
func updateChannelPost(post *tg.Message) {
if post.Chat.ID != channelID {
log.Ln(post.Chat.ID, "!=", channelID)
return

View File

@ -2,54 +2,53 @@ package main
import (
"strconv"
"strings"
log "github.com/kirillDanshin/dlog" // Insert logs only in debug builds
tg "github.com/toby3d/telegram" // My Telegram bindings
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
var r = strings.NewReplacer(
"🏻", "",
"🏼", "",
"🏽", "",
"🏾", "",
"🏿", "",
)
func inlineQuery(inline *tg.InlineQuery) {
inline.Query = r.Replace(inline.Query)
log.Ln("Let's preparing answer...")
T, err := switchLocale(inline.From.LanguageCode)
errCheck(err)
log.Ln("INLINE OFFSET:", inline.Offset)
if inline.Offset == "" {
inline.Offset = "-1"
func updateInlineQuery(inlineQuery *tg.InlineQuery) {
fixedQuery, err := fixEmoji(inlineQuery.Query)
if err == nil {
inlineQuery.Query = fixedQuery
}
offset, err := strconv.Atoi(inline.Offset)
errCheck(err)
offset++
log.Ln("CURRENT OFFSET:", inline.Offset)
answer := &tg.AnswerInlineQueryParameters{}
answer.InlineQueryID = inline.ID
answer.InlineQueryID = inlineQuery.ID
answer.CacheTime = 1
answer.IsPersonal = true
if len([]rune(inlineQuery.Query)) >= 256 {
_, err = bot.AnswerInlineQuery(answer)
errCheck(err)
return
}
log.Ln("Let's preparing answer...")
T, err := switchLocale(inlineQuery.From.LanguageCode)
errCheck(err)
log.Ln("INLINE OFFSET:", inlineQuery.Offset)
if inlineQuery.Offset == "" {
inlineQuery.Offset = "-1"
}
offset, err := strconv.Atoi(inlineQuery.Offset)
errCheck(err)
offset++
stickers, packSize, err := dbGetUserStickers(
inline.From.ID, offset, inline.Query,
inlineQuery.From.ID, offset, inlineQuery.Query,
)
errCheck(err)
totalStickers := len(stickers)
if totalStickers == 0 {
if offset == 0 {
if inline.Query != "" {
if inlineQuery.Query != "" {
// If search stickers by emoji return 0 results
answer.SwitchPrivateMessageText = T(
"button_inline_nothing", map[string]interface{}{
"Query": inline.Query,
"Query": inlineQuery.Query,
},
)
answer.SwitchPrivateMessageParameter = cmdAddSticker
@ -58,10 +57,8 @@ func inlineQuery(inline *tg.InlineQuery) {
answer.SwitchPrivateMessageText = T("button_inline_empty")
answer.SwitchPrivateMessageParameter = cmdAddSticker
}
} else {
return
answer.Results = nil
}
answer.Results = nil
} else {
log.Ln("STICKERS FROM REQUEST:", totalStickers)
if totalStickers > 50 {
@ -79,18 +76,16 @@ func inlineQuery(inline *tg.InlineQuery) {
}
answer.SwitchPrivateMessageText = T(
"button_inline_add", packSize, map[string]interface{}{
"button_inline_search", packSize, map[string]interface{}{
"Count": packSize,
},
)
answer.SwitchPrivateMessageParameter = cmdAddSticker
answer.SwitchPrivateMessageParameter = cmdHelp
answer.Results = results
}
log.Ln("CacheTime:", answer.CacheTime)
_, err = bot.AnswerInlineQuery(answer)
if err != nil {
log.Ln(err.Error())
}
errCheck(err)
}

22
update_message.go Normal file
View File

@ -0,0 +1,22 @@
package main
import (
log "github.com/kirillDanshin/dlog"
tg "github.com/toby3d/telegram"
)
func updateMessage(msg *tg.Message) {
if bot.IsMessageFromMe(msg) || bot.IsForwardFromMe(msg) {
log.Ln("Ignore message update")
return
}
switch {
case bot.IsCommandToMe(msg):
commands(msg)
case msg.Text != "":
messages(msg)
default:
actions(msg)
}
}