mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-08-14 15:20:59 +00:00
refactor(tgbot): share numeric keypad transitions (#6211)
Co-authored-by: n0ctal <293235942+n0ctal@users.noreply.github.com>
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
package tgbot
|
||||
|
||||
// updateNumericInput applies one key from the shared inline number pad.
|
||||
// Key -2 clears the value, -1 removes the last decimal digit, and 0..9 append
|
||||
// a digit. Callers retain their own validation and keyboard labels.
|
||||
func updateNumericInput(value, key int) int {
|
||||
switch key {
|
||||
case -2:
|
||||
return 0
|
||||
case -1:
|
||||
if value > 0 {
|
||||
return value / 10
|
||||
}
|
||||
return value
|
||||
default:
|
||||
return value*10 + key
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,38 @@
|
||||
package tgbot
|
||||
|
||||
import (
|
||||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestUpdateNumericInput(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
value, key int
|
||||
want int
|
||||
}{
|
||||
{name: "append digit", value: 12, key: 3, want: 123},
|
||||
{name: "append zero", value: 12, key: 0, want: 120},
|
||||
{name: "backspace", value: 123, key: -1, want: 12},
|
||||
{name: "backspace zero", value: 0, key: -1, want: 0},
|
||||
{name: "clear", value: 123, key: -2, want: 0},
|
||||
}
|
||||
for _, tt := range tests {
|
||||
t.Run(tt.name, func(t *testing.T) {
|
||||
if got := updateNumericInput(tt.value, tt.key); got != tt.want {
|
||||
t.Fatalf("updateNumericInput(%d, %d) = %d, want %d", tt.value, tt.key, got, tt.want)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestNumericInputTransitionIsUsedByEveryKeypad(t *testing.T) {
|
||||
source, err := os.ReadFile("tgbot_router.go")
|
||||
if err != nil {
|
||||
t.Fatalf("read tgbot_router.go: %v", err)
|
||||
}
|
||||
if got := strings.Count(string(source), "updateNumericInput("); got != 6 {
|
||||
t.Fatalf("numeric keypad transition call sites = %d, want 6", got)
|
||||
}
|
||||
}
|
||||
@@ -439,16 +439,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 4 {
|
||||
num, err := strconv.Atoi(dataArray[3])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
@@ -509,16 +500,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 3 {
|
||||
num, err := strconv.Atoi(dataArray[2])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
@@ -639,16 +621,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 4 {
|
||||
num, err := strconv.Atoi(dataArray[3])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
@@ -721,16 +694,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 3 {
|
||||
num, err := strconv.Atoi(dataArray[2])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
@@ -827,16 +791,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 4 {
|
||||
num, err := strconv.Atoi(dataArray[3])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
@@ -900,16 +855,7 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
|
||||
if len(dataArray) == 3 {
|
||||
num, err := strconv.Atoi(dataArray[2])
|
||||
if err == nil {
|
||||
switch num {
|
||||
case -2:
|
||||
inputNumber = 0
|
||||
case -1:
|
||||
if inputNumber > 0 {
|
||||
inputNumber = (inputNumber / 10)
|
||||
}
|
||||
default:
|
||||
inputNumber = (inputNumber * 10) + num
|
||||
}
|
||||
inputNumber = updateNumericInput(inputNumber, num)
|
||||
}
|
||||
if inputNumber == oldInputNumber {
|
||||
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation"))
|
||||
|
||||
Reference in New Issue
Block a user