Compare commits

..

1 commit

Author SHA1 Message Date
nistootsin
9161c7e8e6
Merge cbdcf1c344 into 29033a7828 2025-03-20 20:49:05 +00:00
20 changed files with 517 additions and 574 deletions

View file

@ -253,8 +253,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 9.5+ - AlmaLinux 8.0+
- Rocky Linux 9.5+ - Rocky Linux 8+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -254,8 +254,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 9.5+ - AlmaLinux 8.0+
- Rocky Linux 9.5+ - Rocky Linux 8+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -258,8 +258,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 9.5+ - AlmaLinux 8.0+
- Rocky Linux 9.5+ - Rocky Linux 8+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -257,8 +257,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 9.5+ - AlmaLinux 8.0+
- Rocky Linux 9.5+ - Rocky Linux 8+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -254,8 +254,8 @@ location /sub {
- Parch Linux - Parch Linux
- Manjaro - Manjaro
- Armbian - Armbian
- AlmaLinux 9.5+ - AlmaLinux 8.0+
- Rocky Linux 9.5+ - Rocky Linux 8+
- Oracle Linux 8+ - Oracle Linux 8+
- OpenSUSE Tubleweed - OpenSUSE Tubleweed
- Amazon Linux 2023 - Amazon Linux 2023

View file

@ -14,10 +14,10 @@ cur_dir=$(pwd)
# Check OS and set release variable # Check OS and set release variable
if [[ -f /etc/os-release ]]; then if [[ -f /etc/os-release ]]; then
source /etc/os-release source /etc/os-release
release=$PRETTY_NAME release=$ID
elif [[ -f /usr/lib/os-release ]]; then elif [[ -f /usr/lib/os-release ]]; then
source /usr/lib/os-release source /usr/lib/os-release
release=$PRETTY_NAME release=$ID
else else
echo "Failed to check the system OS, please contact the author!" >&2 echo "Failed to check the system OS, please contact the author!" >&2
exit 1 exit 1
@ -39,18 +39,81 @@ arch() {
echo "arch: $(arch)" echo "arch: $(arch)"
check_glibc_version() { os_version=""
glibc_version=$(ldd --version | head -n1 | awk '{print $NF}') os_version=$(grep "^VERSION_ID" /etc/os-release | cut -d '=' -f2 | tr -d '"' | tr -d '.')
required_version="2.32" if [[ "${release}" == "arch" ]]; then
if [[ "$(printf '%s\n' "$required_version" "$glibc_version" | sort -V | head -n1)" != "$required_version" ]]; then echo "Your OS is Arch Linux"
echo -e "${red}GLIBC version $glibc_version is too old! Required: 2.32 or higher${plain}" elif [[ "${release}" == "parch" ]]; then
echo "Please upgrade to a newer version of your operating system to get a higher GLIBC version." echo "Your OS is Parch Linux"
exit 1 elif [[ "${release}" == "manjaro" ]]; then
echo "Your OS is Manjaro"
elif [[ "${release}" == "armbian" ]]; then
echo "Your OS is Armbian"
elif [[ "${release}" == "alpine" ]]; then
echo "Your OS is Alpine Linux"
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
echo "Your OS is OpenSUSE Tumbleweed"
elif [[ "${release}" == "openEuler" ]]; then
if [[ ${os_version} -lt 2203 ]]; then
echo -e "${red} Please use OpenEuler 22.03 or higher ${plain}\n" && exit 1
fi fi
echo "GLIBC version: $glibc_version (meets requirement of 2.32+)" elif [[ "${release}" == "centos" ]]; then
} if [[ ${os_version} -lt 8 ]]; then
check_glibc_version echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "ubuntu" ]]; then
if [[ ${os_version} -lt 2204 ]]; then
echo -e "${red} Please use Ubuntu 22 or higher version!${plain}\n" && exit 1
fi
elif [[ "${release}" == "fedora" ]]; then
if [[ ${os_version} -lt 36 ]]; then
echo -e "${red} Please use Fedora 36 or higher version!${plain}\n" && exit 1
fi
elif [[ "${release}" == "amzn" ]]; then
if [[ ${os_version} != "2023" ]]; then
echo -e "${red} Please use Amazon Linux 2023!${plain}\n" && exit 1
fi
elif [[ "${release}" == "debian" ]]; then
if [[ ${os_version} -lt 12 ]]; then
echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "almalinux" ]]; then
if [[ ${os_version} -lt 80 ]]; then
echo -e "${red} Please use AlmaLinux 8.0 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "rocky" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "ol" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "virtuozzo" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Virtuozzo Linux 8 or higher ${plain}\n" && exit 1
fi
else
echo -e "${red}Your operating system is not supported by this script.${plain}\n"
echo "Please ensure you are using one of the following supported operating systems:"
echo "- Ubuntu 22.04+"
echo "- Debian 12+"
echo "- CentOS 8+"
echo "- OpenEuler 22.03+"
echo "- Fedora 36+"
echo "- Arch Linux"
echo "- Parch Linux"
echo "- Manjaro"
echo "- Armbian"
echo "- AlmaLinux 8.0+"
echo "- Rocky Linux 8+"
echo "- Oracle Linux 8+"
echo "- OpenSUSE Tumbleweed"
echo "- Amazon Linux 2023"
echo "- Virtuozzo Linux 8+"
exit 1
fi
install_base() { install_base() {
case "${release}" in case "${release}" in

View file

@ -10,7 +10,6 @@ import (
"net" "net"
"net/url" "net/url"
"os" "os"
"regexp"
"strconv" "strconv"
"strings" "strings"
"time" "time"
@ -271,72 +270,61 @@ func (t *Tgbot) OnReceive() {
if userState, exists := userStates[message.Chat.ID]; exists { if userState, exists := userStates[message.Chat.ID]; exists {
switch userState { switch userState {
case "awaiting_id": case "awaiting_id":
client_Id = strings.TrimSpace(message.Text) client_Id = message.Text
if t.isSingleWord(client_Id) { userStates[message.Chat.ID] = "awaiting_email"
userStates[message.Chat.ID] = "awaiting_id" t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_id", "ClientId=="+client_Id), tu.ReplyKeyboardRemove())
cancel_btn_markup := tu.InlineKeyboard(
cancel_btn_markup := tu.InlineKeyboard( tu.InlineKeyboardRow(
tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_id"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_password_tr": case "awaiting_password_tr":
client_TrPassword = strings.TrimSpace(message.Text) client_TrPassword = message.Text
if t.isSingleWord(client_TrPassword) { userStates[message.Chat.ID] = "awaiting_email"
userStates[message.Chat.ID] = "awaiting_password_tr" t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_password", "ClientPass=="+client_TrPassword), tu.ReplyKeyboardRemove())
cancel_btn_markup := tu.InlineKeyboard(
cancel_btn_markup := tu.InlineKeyboard( tu.InlineKeyboardRow(
tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_password_sh": case "awaiting_password_sh":
client_ShPassword = strings.TrimSpace(message.Text) client_ShPassword = message.Text
if t.isSingleWord(client_ShPassword) { userStates[message.Chat.ID] = "awaiting_email"
userStates[message.Chat.ID] = "awaiting_password_sh" t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_password", "ClientPass=="+client_ShPassword), tu.ReplyKeyboardRemove())
cancel_btn_markup := tu.InlineKeyboard(
cancel_btn_markup := tu.InlineKeyboard( tu.InlineKeyboardRow(
tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email), cancel_btn_markup)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_password"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_email": case "awaiting_email":
client_Email = strings.TrimSpace(message.Text) client_Email = message.Text
if t.isSingleWord(client_Email) { userStates[message.Chat.ID] = "awaiting_comment"
userStates[message.Chat.ID] = "awaiting_email" t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_email", "ClientEmail=="+client_Email), tu.ReplyKeyboardRemove())
cancel_btn_markup := tu.InlineKeyboard(
cancel_btn_markup := tu.InlineKeyboard( tu.InlineKeyboardRow(
tu.InlineKeyboardRow( tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment), cancel_btn_markup)
t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.incorrect_input"), cancel_btn_markup)
} else {
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_email"), 3, tu.ReplyKeyboardRemove())
delete(userStates, message.Chat.ID)
}
case "awaiting_comment": case "awaiting_comment":
client_Comment = strings.TrimSpace(message.Text) client_Comment = message.Text
t.SendMsgToTgbotDeleteAfter(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment"), 3, tu.ReplyKeyboardRemove()) t.SendMsgToTgbot(message.Chat.ID, t.I18nBot("tgbot.messages.received_comment", "ClientComment=="+client_Comment), tu.ReplyKeyboardRemove())
message_text, _ := t.BuildClientDataMessage()
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
),
)
t.SendMsgToTgbot(message.Chat.ID, message_text, inlineKeyboard)
delete(userStates, message.Chat.ID) delete(userStates, message.Chat.ID)
} }
@ -474,7 +462,7 @@ func (t *Tgbot) randomShadowSocksPassword() string {
func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) { func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool) {
chatId := callbackQuery.Message.GetChat().ID chatId := callbackQuery.Message.GetChat().ID
if isAdmin { if isAdmin {
// get query from hash storage // get query from hash storage
decodedQuery, err := t.decodeQuery(callbackQuery.Data) decodedQuery, err := t.decodeQuery(callbackQuery.Data)
@ -1078,72 +1066,53 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
} }
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient")) t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.buttons.addClient"))
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.answers.chooseInbound"), inbounds)
case "add_client_refresh": case "add_client_ch_default":
messageId := callbackQuery.Message.GetMessageID() var prompt_state string
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID) var prompt_message string
if err != nil {
t.sendCallbackAnswerTgBot(callbackQuery.ID, err.Error())
return
}
message_text, err := t.BuildInboundClientDataMessage(inbound.Remark, inbound.Protocol)
t.addClient(chatId,message_text,messageId)
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.clientRefreshSuccess", "Email=="+client_Email)) prompt_state ,prompt_message, _ = t.BuildClientChDefaultResponse()
case "add_client_ch_default_email": cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_id_pass"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
t.SendMsgToTgbot(chatId, prompt_message,cancel_btn_markup)
userStates[chatId] = prompt_state
case "default_client_id_pass":
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.email_prompt", "ClientEmail=="+client_Email),cancel_btn_markup)
userStates[chatId] = "awaiting_email" userStates[chatId] = "awaiting_email"
cancel_btn_markup := tu.InlineKeyboard( case "default_client_email":
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("default_client_comment"),
), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
) )
prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Email) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment),inlineKeyboard)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_id":
userStates[chatId] = "awaiting_id"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_pass_tr":
userStates[chatId] = "awaiting_password_tr"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_pass_sh":
userStates[chatId] = "awaiting_password_sh"
cancel_btn_markup := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"),
),
)
prompt_message := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup)
case "add_client_ch_default_comment":
userStates[chatId] = "awaiting_comment" userStates[chatId] = "awaiting_comment"
cancel_btn_markup := tu.InlineKeyboard( case "default_client_comment":
message_text, _ := t.BuildClientDataMessage()
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow( tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.use_default")).WithCallbackData("add_client_default_info"), tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
), ),
) )
prompt_message := t.I18nBot("tgbot.messages.comment_prompt", "ClientComment=="+client_Comment)
t.SendMsgToTgbot(chatId, prompt_message, cancel_btn_markup) t.SendMsgToTgbot(chatId, message_text, inlineKeyboard)
case "add_client_ch_default_traffic":
userStates[chatId] = "awaiting_id"
case "add_client_ch_default_exp":
userStates[chatId] = "awaiting_id"
case "add_client_default_info":
t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.using_default_value"), 3, tu.ReplyKeyboardRemove())
delete(userStates, chatId) delete(userStates, chatId)
case "add_client_cancel": case "add_client_cancel":
delete(userStates, chatId) delete(userStates, chatId)
t.SendMsgToTgbotDeleteAfter(chatId, t.I18nBot("tgbot.messages.cancel"), 5, tu.ReplyKeyboardRemove()) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.cancel"), tu.ReplyKeyboardRemove())
case "add_client_submit_disable": case "add_client_submit_disable":
client_Enable = false client_Enable = false
_, err := t.SubmitAddClient() _, err := t.SubmitAddClient()
@ -1151,12 +1120,38 @@ func (t *Tgbot) answerCallback(callbackQuery *telego.CallbackQuery, isAdmin bool
errorMessage := fmt.Sprintf("%v", err) errorMessage := fmt.Sprintf("%v", err)
t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove()) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.error_add_client", "error=="+errorMessage), tu.ReplyKeyboardRemove())
} else { } else {
t.sendCallbackAnswerTgBot(callbackQuery.ID, t.I18nBot("tgbot.answers.successfulOperation")) t.SendMsgToTgbot(chatId, t.I18nBot("tgbot.messages.success_add_client"), tu.ReplyKeyboardRemove())
} }
} }
} }
func (t *Tgbot) BuildClientChDefaultResponse() (string,string,error) {
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
if err != nil {
logger.Warning("getIboundClients run failed:", err)
return "", "",errors.New(t.I18nBot("tgbot.answers.getInboundsFailed"))
}
protocol := inbound.Protocol
switch protocol {
case model.VMESS, model.VLESS:
prompt := t.I18nBot("tgbot.messages.id_prompt", "ClientId=="+client_Id)
return "awaiting_id", prompt,errors.New("unknown protocol")
case model.Trojan:
prompt := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_TrPassword)
return "awaiting_password_tr", prompt,errors.New("unknown protocol")
case model.Shadowsocks:
prompt := t.I18nBot("tgbot.messages.pass_prompt", "ClientPassword=="+client_ShPassword)
return "awaiting_password_sh", prompt,errors.New("unknown protocol")
default:
return "","", errors.New("unknown protocol")
}
}
func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) { func (t *Tgbot) BuildInboundClientDataMessage(inbound_remark string ,protocol model.Protocol) (string, error) {
var message string var message string
@ -1206,6 +1201,7 @@ func (t *Tgbot) BuildClientDataMessage() (string, error) {
} }
func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) { func (t *Tgbot) BuildJSONForProtocol(protocol model.Protocol) (string, error) {
var jsonString string var jsonString string
@ -1944,98 +1940,23 @@ func (t *Tgbot) searchClient(chatId int64, email string, messageID ...int) {
} }
} }
func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) { func (t *Tgbot) addClient(chatId int64, msg string, messageID ...int) {
inbound, err := t.inboundService.GetInbound(receiver_inbound_ID)
if err != nil { inlineKeyboard := tu.InlineKeyboard(
t.SendMsgToTgbot(chatId, err.Error()) tu.InlineKeyboardRow(
return tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_default")).WithCallbackData("add_client_ch_default"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
if len(messageID) > 0 {
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
} else {
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
} }
protocol := inbound.Protocol
switch protocol {
case model.VMESS, model.VLESS:
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_id")).WithCallbackData("add_client_ch_default_id"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
if len(messageID) > 0 {
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
} else {
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
}
case model.Trojan:
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_tr"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
if len(messageID) > 0 {
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
} else {
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
}
case model.Shadowsocks:
inlineKeyboard := tu.InlineKeyboard(
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.refresh")).WithCallbackData("add_client_refresh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_email")).WithCallbackData("add_client_ch_default_email"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_password")).WithCallbackData("add_client_ch_default_pass_sh"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.limitTraffic")).WithCallbackData("add_client_ch_default_traffic"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.resetExpire")).WithCallbackData("add_client_ch_default_exp"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.change_comment")).WithCallbackData("add_client_ch_default_comment"),
),
tu.InlineKeyboardRow(
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.submitDisable")).WithCallbackData("add_client_submit_disable"),
tu.InlineKeyboardButton(t.I18nBot("tgbot.buttons.cancel")).WithCallbackData("add_client_cancel"),
),
)
if len(messageID) > 0 {
t.editMessageTgBot(chatId, messageID[0], msg, inlineKeyboard)
} else {
t.SendMsgToTgbot(chatId, msg, inlineKeyboard)
}
}
} }
func (t *Tgbot) searchInbound(chatId int64, remark string) { func (t *Tgbot) searchInbound(chatId int64, remark string) {
@ -2407,50 +2328,4 @@ func (t *Tgbot) editMessageTgBot(chatId int64, messageID int, text string, inlin
if _, err := bot.EditMessageText(&params); err != nil { if _, err := bot.EditMessageText(&params); err != nil {
logger.Warning(err) logger.Warning(err)
} }
} }
func (t *Tgbot) SendMsgToTgbotDeleteAfter(chatId int64, msg string, delayInSeconds int, replyMarkup ...telego.ReplyMarkup) {
// Determine if replyMarkup was passed; otherwise, set it to nil
var replyMarkupParam telego.ReplyMarkup
if len(replyMarkup) > 0 {
replyMarkupParam = replyMarkup[0] // Use the first element
}
// Send the message
sentMsg, err := bot.SendMessage(&telego.SendMessageParams{
ChatID: tu.ID(chatId),
Text: msg,
ReplyMarkup: replyMarkupParam, // Use the correct replyMarkup value
})
if err != nil {
logger.Warning("Failed to send message:", err)
return
}
// Delete the sent message after the specified number of seconds
go func() {
time.Sleep(time.Duration(delayInSeconds) * time.Second) // Wait for the specified delay
t.deleteMessageTgBot(chatId, sentMsg.MessageID) // Delete the message
delete(userStates, chatId)
}()
}
func (t *Tgbot) deleteMessageTgBot(chatId int64, messageID int) {
params := telego.DeleteMessageParams{
ChatID: tu.ID(chatId),
MessageID: messageID,
}
if err := bot.DeleteMessage(&params); err != nil {
logger.Warning("Failed to delete message:", err)
} else {
logger.Info("Message deleted successfully")
}
}
func (t *Tgbot) isSingleWord(text string) bool {
text = strings.TrimSpace(text)
re := regexp.MustCompile(`\s+`)
return re.MatchString(text)
}

View file

@ -582,10 +582,10 @@
"yes" = "✅ Yes" "yes" = "✅ Yes"
"no" = "❌ No" "no" = "❌ No"
"received_id" = "🔑📥 ID updated. Press refresh to see changes." "received_id" = "🔑📥 Received ID: {{ .ClientId }}"
"received_password" = "🔑📥 Password updated. Press refresh to see changes." "received_password" = "🔑📥 Received Password: {{ .ClientPass }}"
"received_email" = "📧📥 Email updated. Press refresh to see changes." "received_email" = "📧📥 Received Email: {{ .ClientEmail }}"
"received_comment" = "💬📥 Comment updated. Press refresh to see changes." "received_comment" = "💬📥 Received Comment: {{ .ClientComment }}"
"id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id." "id_prompt" = "🔑 Default ID: {{ .ClientId }}\n\nEnter your id."
"pass_prompt" = "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password." "pass_prompt" = "🔑 Default Password: {{ .ClientPassword }}\n\nEnter your password."
"email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email." "email_prompt" = "📧 Default Email: {{ .ClientEmail }}\n\nEnter your email."
@ -596,8 +596,7 @@
"client_data_pass" = "🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!" "client_data_pass" = "🔑 Password: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comment: {{ .ClientComment }}\n\nYou can add the client to inbound now!"
"cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄" "cancel" = "❌ Process Canceled! \n\nYou can /start again anytime. 🔄"
"error_add_client" = "⚠️ Error:\n\n {{ .error }}" "error_add_client" = "⚠️ Error:\n\n {{ .error }}"
"using_default_value" = "Okay, I'll stick with the default value. 😊" "success_add_client" = "🏆 Success! \nYou can now modify it using the 'All Clients' inline button."
"incorrect_input" ="Your input is not valid.\nThe phrases should be continuous without spaces.\nCorrect example: aaaaaa\nIncorrect example: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
"closeKeyboard" = "❌ Close Keyboard" "closeKeyboard" = "❌ Close Keyboard"
@ -636,10 +635,7 @@
"addClient" = "Add Client" "addClient" = "Add Client"
"submitDisable" = "Submit As Disable ✅" "submitDisable" = "Submit As Disable ✅"
"use_default" = "🏷️ Use default" "use_default" = "🏷️ Use default"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Change Default"
"change_password" = "⚙️🔑 Password"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Comment"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operation successful!" "successfulOperation" = "✅ Operation successful!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ Sí" "yes" = "✅ Sí"
"no" = "❌ No" "no" = "❌ No"
"received_id" = "🔑📥 ID actualizada. Pulsa refrescar para ver los cambios." "received_id" = "🔑📥 ID recibido: {{ .ClientId }}"
"received_password" = "🔑📥 Contraseña actualizada. Pulsa refrescar para ver los cambios." "received_password" = "🔑📥 Contraseña recibida: {{ .ClientPass }}"
"received_email" = "📧📥 Correo electrónico actualizado. Pulsa refrescar para ver los cambios." "received_email" = "📧📥 Correo electrónico recibido: {{ .ClientEmail }}"
"received_comment" = "💬📥 Comentario actualizado. Pulsa refrescar para ver los cambios." "received_comment" = "💬📥 Comentario recibido: {{ .ClientComment }}"
"id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID." "id_prompt" = "🔑 ID predeterminado: {{ .ClientId }}\n\nIntroduce tu ID."
"pass_prompt" = "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña." "pass_prompt" = "🔑 Contraseña predeterminada: {{ .ClientPassword }}\n\nIntroduce tu contraseña."
"email_prompt" = "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico." "email_prompt" = "📧 Correo electrónico predeterminado: {{ .ClientEmail }}\n\nIntroduce tu correo electrónico."
"comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario." "comment_prompt" = "💬 Comentario predeterminado: {{ .ClientComment }}\n\nIntroduce tu comentario."
"inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" "inbound_client_data_id" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!"
"inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" "inbound_client_data_pass" = "🔄 Inbound: {{ .InboundRemark }}\n\n🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!"
"client_data_pass" = "🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Puedes añadir el cliente a la entrada ahora!" "client_data_pass" = "🔑 Contraseña: {{ .ClientPass }}\n📧 Correo electrónico: {{ .ClientEmail }}\n💬 Comentario: {{ .ClientComment }}\n\n¡Ahora puedes agregar al cliente a inbound!"
"cancel" = "❌ ¡Proceso cancelado! \n\nPuedes /start nuevamente en cualquier momento. 🔄" "cancel" = "❌ ¡Proceso cancelado! \n\nPuedes usar /start en cualquier momento. 🔄"
"error_add_client" = "⚠️ Error:\n\n {{ .error }}" "error_add_client" = "⚠️ Error:\n\n {{ .error }}"
"using_default_value" = "Está bien, usaré el valor predeterminado. 😊" "success_add_client" = "🏆 ¡Éxito! \nAhora puedes modificarlo usando el botón en línea 'Todos los Clientes'."
"incorrect_input" = "Tu entrada no es válida.\nLas frases deben ser continuas sin espacios.\nEjemplo correcto: aaaaaa\nEjemplo incorrecto: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -638,12 +637,8 @@
"addClient" = "Añadir Cliente" "addClient" = "Añadir Cliente"
"submitDisable" = "Enviar como Deshabilitado ✅" "submitDisable" = "Enviar como Deshabilitado ✅"
"use_default" = "🏷️ Usar predeterminado" "use_default" = "🏷️ Usar por defecto"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Cambiar por defecto"
"change_password" = "⚙️🔑 Contraseña"
"change_email" = "⚙️📧 Correo electrónico"
"change_comment" = "⚙️💬 Comentario"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ ¡Exitosa!" "successfulOperation" = "✅ ¡Exitosa!"

View file

@ -584,23 +584,21 @@
"yes" = "✅ بله" "yes" = "✅ بله"
"no" = "❌ خیر" "no" = "❌ خیر"
"received_id" = "🔑📥 ID به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید." "received_id" = "🔑📥 شناسه دریافت شده: {{ .ClientId }}"
"received_password" = "🔑📥 رمز عبور به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید." "received_password" = "🔑📥 رمز عبور دریافت شده: {{ .ClientPass }}"
"received_email" = "📧📥 ایمیل به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید." "received_email" = "📧📥 ایمیل دریافت شده: {{ .ClientEmail }}"
"received_comment" = "💬📥 نظر به‌روزرسانی شد. لطفاً برای مشاهده تغییرات، دکمه رفرش را فشار دهید." "received_comment" = "💬📥 نظر دریافت شده: {{ .ClientComment }}"
"id_prompt" = "🔑 ID پیش‌فرض: {{ .ClientId }}\n\nلطفاً ID خود را وارد کنید." "id_prompt" = "🔑 شناسه پیش‌فرض: {{ .ClientId }}\n\nشناسه خود را وارد کنید."
"pass_prompt" = "🔑 رمز عبور پیش‌فرض: {{ .ClientPassword }}\n\nلطفاً رمز عبور خود را وارد کنید." "pass_prompt" = "🔑 رمز عبور پیش‌فرض: {{ .ClientPassword }}\n\nرمز عبور خود را وارد کنید."
"email_prompt" = "📧 ایمیل پیش‌فرض: {{ .ClientEmail }}\n\nلطفاً ایمیل خود را وارد کنید." "email_prompt" = "📧 ایمیل پیش‌فرض: {{ .ClientEmail }}\n\nایمیل خود را وارد کنید."
"comment_prompt" = "💬 نظر پیش‌فرض: {{ .ClientComment }}\n\nلطفاً نظر خود را وارد کنید." "comment_prompt" = "💬 نظر پیش‌فرض: {{ .ClientComment }}\n\nنظر خود را وارد کنید."
"inbound_client_data_id" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!" "inbound_client_data_id" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!"
"inbound_client_data_pass" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!" "inbound_client_data_pass" = "🔄 ورودی: {{ .InboundRemark }}\n\n🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!" "client_data_id" = "🔑 شناسه: {{ .ClientId }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!"
"client_data_pass" = "🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nشما می‌توانید مشتری را به ورودی اضافه کنید!" "client_data_pass" = "🔑 رمز عبور: {{ .ClientPass }}\n📧 ایمیل: {{ .ClientEmail }}\n💬 نظر: {{ .ClientComment }}\n\nاکنون می‌توانید مشتری را به ورودی اضافه کنید!"
"cancel" = "❌ فرایند لغو شد! \n\nشما می‌توانید هر زمان با /start دوباره شروع کنید. 🔄" "cancel" = "❌ فرایند لغو شد! \n\nشما می‌توانید هر زمان که خواستید /start را اجرا کنید. 🔄"
"error_add_client" = "⚠️ خطا:\n\n {{ .error }}" "error_add_client" = "⚠️ خطا:\n\n {{ .error }}"
"using_default_value" = "باشه، من با مقدار پیش‌فرض ادامه میدم. 😊" "success_add_client" = "🏆 موفقیت! اکنون می‌توانید آن را از طریق دکمه 'همه مشتریان' ویرایش کنید."
"incorrect_input" = "ورودی شما نامعتبر است.\nعبارات باید پیوسته باشند بدون فاصله.\nمثال صحیح: aaaaaa\nمثال غلط: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -637,14 +635,10 @@
"getBanLogs" = "گزارش های بلوک را دریافت کنید" "getBanLogs" = "گزارش های بلوک را دریافت کنید"
"allClients" = "همه مشتریان" "allClients" = "همه مشتریان"
"addClient" = "اضافه کردن مشتری" "addClient" = "افزودن مشتری"
"submitDisable" = "ارسال به عنوان غیرفعال ✅" "submitDisable" = "ارسال به عنوان غیرفعال ✅"
"use_default" = "🏷️ استفاده از پیش‌فرض" "use_default" = "🏷️ استفاده از پیش‌فرض"
"change_id" = "⚙️🔑 شناسه" "change_default" = "🔄⚙️ تغییر پیش‌فرض"
"change_password" = "⚙️🔑 رمز عبور"
"change_email" = "⚙️📧 ایمیل"
"change_comment" = "⚙️💬 نظر"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ انجام شد!" "successfulOperation" = "✅ انجام شد!"

View file

@ -583,22 +583,22 @@
"yes" = "✅ Ya" "yes" = "✅ Ya"
"no" = "❌ Tidak" "no" = "❌ Tidak"
"received_id" = "🔑📥 ID diperbarui. Tekan refresh untuk melihat perubahan."
"received_password" = "🔑📥 Kata sandi diperbarui. Tekan refresh untuk melihat perubahan." "received_id" = "🔑📥 ID yang diterima: {{ .ClientId }}"
"received_email" = "📧📥 Email diperbarui. Tekan refresh untuk melihat perubahan." "received_password" = "🔑📥 Kata sandi yang diterima: {{ .ClientPass }}"
"received_comment" = "💬📥 Komentar diperbarui. Tekan refresh untuk melihat perubahan." "received_email" = "📧📥 Email yang diterima: {{ .ClientEmail }}"
"id_prompt" = "🔑 ID default: {{ .ClientId }}\n\nMasukkan ID Anda." "received_comment" = "💬📥 Komentar yang diterima: {{ .ClientComment }}"
"pass_prompt" = "🔑 Kata sandi default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda." "id_prompt" = "🔑 ID Default: {{ .ClientId }}\n\nMasukkan ID Anda."
"email_prompt" = "📧 Email default: {{ .ClientEmail }}\n\nMasukkan email Anda." "pass_prompt" = "🔑 Kata Sandi Default: {{ .ClientPassword }}\n\nMasukkan kata sandi Anda."
"comment_prompt" = "💬 Komentar default: {{ .ClientComment }}\n\nMasukkan komentar Anda." "email_prompt" = "📧 Email Default: {{ .ClientEmail }}\n\nMasukkan email Anda."
"inbound_client_data_id" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!" "comment_prompt" = "💬 Komentar Default: {{ .ClientComment }}\n\nMasukkan komentar Anda."
"inbound_client_data_pass" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!" "inbound_client_data_id" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!" "inbound_client_data_pass" = "🔄 Masuk: {{ .InboundRemark }}\n\n🔑 Kata Sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!"
"client_data_pass" = "🔑 Kata sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nSekarang Anda dapat menambahkan klien ke inbound!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!"
"cancel" = "❌ Proses dibatalkan! \n\nAnda dapat /start kapan saja. 🔄" "client_data_pass" = "🔑 Kata Sandi: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Komentar: {{ .ClientComment }}\n\nAnda dapat menambahkan klien ke inbound sekarang!"
"cancel" = "❌ Proses Dibatalkan! \n\nAnda dapat memulai lagi kapan saja dengan /start. 🔄"
"error_add_client" = "⚠️ Kesalahan:\n\n {{ .error }}" "error_add_client" = "⚠️ Kesalahan:\n\n {{ .error }}"
"using_default_value" = "Baik, saya akan tetap dengan nilai default. 😊" "success_add_client" = "🏆 Berhasil! \nSekarang Anda dapat mengeditnya menggunakan tombol 'Semua Klien'."
"incorrect_input" = "Input Anda tidak valid.\nFrasa harus berurutan tanpa spasi.\nContoh yang benar: aaaaaa\nContoh yang salah: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -637,12 +637,8 @@
"addClient" = "Tambah Klien" "addClient" = "Tambah Klien"
"submitDisable" = "Kirim Sebagai Nonaktif ✅" "submitDisable" = "Kirim Sebagai Nonaktif ✅"
"use_default" = "🏷️ Gunakan default" "use_default" = "🏷️ Gunakan Default"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Ubah Default"
"change_password" = "⚙️🔑 Kata Sandi"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Komentar"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operasi berhasil!" "successfulOperation" = "✅ Operasi berhasil!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ はい" "yes" = "✅ はい"
"no" = "❌ いいえ" "no" = "❌ いいえ"
"received_id" = "🔑📥 IDが更新されました。変更を見るにはリフレッシュを押してください。" "received_id" = "🔑📥 受信したID: {{ .ClientId }}"
"received_password" = "🔑📥 パスワードが更新されました。変更を見るにはリフレッシュを押してください。" "received_password" = "🔑📥 受信したパスワード: {{ .ClientPass }}"
"received_email" = "📧📥 メールが更新されました。変更を見るにはリフレッシュを押してください。" "received_email" = "📧📥 受信したメール: {{ .ClientEmail }}"
"received_comment" = "💬📥 コメントが更新されました。変更を見るにはリフレッシュを押してください。" "received_comment" = "💬📥 受信したコメント: {{ .ClientComment }}"
"id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。" "id_prompt" = "🔑 デフォルトID: {{ .ClientId }}\n\nIDを入力してください。"
"pass_prompt" = "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。" "pass_prompt" = "🔑 デフォルトパスワード: {{ .ClientPassword }}\n\nパスワードを入力してください。"
"email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。" "email_prompt" = "📧 デフォルトメール: {{ .ClientEmail }}\n\nメールアドレスを入力してください。"
"comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。" "comment_prompt" = "💬 デフォルトコメント: {{ .ClientComment }}\n\nコメントを入力してください。"
"inbound_client_data_id" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "inbound_client_data_id" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"inbound_client_data_pass" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "inbound_client_data_pass" = "🔄 インバウンド: {{ .InboundRemark }}\n\n🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"client_data_pass" = "🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます" "client_data_pass" = "🔑 パスワード: {{ .ClientPass }}\n📧 メール: {{ .ClientEmail }}\n💬 コメント: {{ .ClientComment }}\n\n今すぐクライアントをインバウンドに追加できます"
"cancel" = "❌ 処理がキャンセルされました! \n\nいつでも/startを使用して再開できます。 🔄" "cancel" = "❌ プロセスがキャンセルされました!\n\nいつでも /start を使用できます。 🔄"
"error_add_client" = "⚠️ エラー:\n\n {{ .error }}" "error_add_client" = "⚠️ エラー:\n\n {{ .error }}"
"using_default_value" = "わかりました、デフォルト値を使用します。😊" "success_add_client" = "🏆 成功!\n「すべてのクライアント」ボタンを使用して、編集できます。"
"incorrect_input" = "入力が無効です。\nフレーズはスペースなしで連続している必要があります。\n正しい例: aaaaaa\n間違った例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "クライアントを追加" "addClient" = "クライアントを追加"
"submitDisable" = "無効として送信 ✅" "submitDisable" = "無効として送信 ✅"
"use_default" = "🏷️ デフォルトを使用" "use_default" = "🏷️ デフォルトを使用"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ デフォルトを変更"
"change_password" = "⚙️🔑 パスワード"
"change_email" = "⚙️📧 メール"
"change_comment" = "⚙️💬 コメント"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ Sim" "yes" = "✅ Sim"
"no" = "❌ Não" "no" = "❌ Não"
"received_id" = "🔑📥 ID atualizado. Pressione atualizar para ver as mudanças." "received_id" = "🔑📥 ID recebido: {{ .ClientId }}"
"received_password" = "🔑📥 Senha atualizada. Pressione atualizar para ver as mudanças." "received_password" = "🔑📥 Senha recebida: {{ .ClientPass }}"
"received_email" = "📧📥 Email atualizado. Pressione atualizar para ver as mudanças." "received_email" = "📧📥 E-mail recebido: {{ .ClientEmail }}"
"received_comment" = "💬📥 Comentário atualizado. Pressione atualizar para ver as mudanças." "received_comment" = "💬📥 Comentário recebido: {{ .ClientComment }}"
"id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID." "id_prompt" = "🔑 ID padrão: {{ .ClientId }}\n\nDigite seu ID."
"pass_prompt" = "🔑 Senha padrão: {{ .ClientPassword }}\n\nDigite sua senha." "pass_prompt" = "🔑 Senha padrão: {{ .ClientPassword }}\n\nDigite sua senha."
"email_prompt" = "📧 Email padrão: {{ .ClientEmail }}\n\nDigite seu email." "email_prompt" = "📧 E-mail padrão: {{ .ClientEmail }}\n\nDigite seu e-mail."
"comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário." "comment_prompt" = "💬 Comentário padrão: {{ .ClientComment }}\n\nDigite seu comentário."
"inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" "inbound_client_data_id" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!"
"inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" "inbound_client_data_pass" = "🔄 Entrada: {{ .InboundRemark }}\n\n🔑 Senha: {{ .ClientPass }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!"
"client_data_pass" = "🔑 Senha: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nVocê pode adicionar o cliente à entrada agora!" "client_data_pass" = "🔑 Senha: {{ .ClientPass }}\n📧 E-mail: {{ .ClientEmail }}\n💬 Comentário: {{ .ClientComment }}\n\nAgora você pode adicionar o cliente à entrada!"
"cancel" = "❌ Processo cancelado! \n\nVocê pode /start novamente a qualquer momento. 🔄" "cancel" = "❌ Processo cancelado! \n\nVocê pode usar /start a qualquer momento. 🔄"
"error_add_client" = "⚠️ Erro:\n\n {{ .error }}" "error_add_client" = "⚠️ Erro:\n\n {{ .error }}"
"using_default_value" = "Ok, vou manter o valor padrão. 😊" "success_add_client" = "🏆 Sucesso! \nAgora você pode editá-lo usando o botão 'Todos os Clientes'."
"incorrect_input" = "Sua entrada não é válida.\nAs frases devem ser contínuas sem espaços.\nExemplo correto: aaaaaa\nExemplo incorreto: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "Adicionar Cliente" "addClient" = "Adicionar Cliente"
"submitDisable" = "Enviar como Desativado ✅" "submitDisable" = "Enviar como Desativado ✅"
"use_default" = "🏷️ Usar padrão" "use_default" = "🏷️ Usar padrão"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Alterar Padrão"
"change_password" = "⚙️🔑 Senha"
"change_email" = "⚙️📧 E-mail"
"change_comment" = "⚙️💬 Comentário"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Operação bem-sucedida!" "successfulOperation" = "✅ Operação bem-sucedida!"

View file

@ -29,7 +29,7 @@
"copySuccess" = "Скопировано" "copySuccess" = "Скопировано"
"sure" = "Да" "sure" = "Да"
"encryption" = "Шифрование" "encryption" = "Шифрование"
"transmission" = "Протокол" "transmission" = "Протокол передачи"
"host" = "Хост" "host" = "Хост"
"path" = "Путь" "path" = "Путь"
"camouflage" = "Маскировка" "camouflage" = "Маскировка"
@ -67,11 +67,11 @@
"emptyReverseDesc" = "Нет добавленных обратных прокси." "emptyReverseDesc" = "Нет добавленных обратных прокси."
[menu] [menu]
"theme" = "Тема оформления" "theme" = "Тема"
"dark" = "Темная" "dark" = "Темная"
"ultraDark" = "Ультра темная" "ultraDark" = "Ультра темная"
"dashboard" = "Статус системы" "dashboard" = "Статус системы"
"inbounds" = "Входящие подключения" "inbounds" = "Подключения"
"settings" = "Настройки панели" "settings" = "Настройки панели"
"xray" = "Настройки Xray" "xray" = "Настройки Xray"
"logout" = "Выход" "logout" = "Выход"
@ -116,7 +116,7 @@
"xraySwitchVersionDialog" = "Переключить версию Xray" "xraySwitchVersionDialog" = "Переключить версию Xray"
"xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?" "xraySwitchVersionDialogDesc" = "Вы точно хотите сменить версию Xray?"
"dontRefresh" = "Установка в процессе. Не обновляйте страницу" "dontRefresh" = "Установка в процессе. Не обновляйте страницу"
"logs" = "Журнал" "logs" = "Логи"
"config" = "Конфигурация" "config" = "Конфигурация"
"backup" = "Резервная копия" "backup" = "Резервная копия"
"backupTitle" = "База данных резервных копий" "backupTitle" = "База данных резервных копий"
@ -126,10 +126,10 @@
"importDatabaseDesc" = "Нажмите, чтобы выбрать и загрузить файл .db с вашего устройства для восстановления базы данных из резервной копии." "importDatabaseDesc" = "Нажмите, чтобы выбрать и загрузить файл .db с вашего устройства для восстановления базы данных из резервной копии."
[pages.inbounds] [pages.inbounds]
"title" = "Входящие подключения" "title" = "Подключения"
"totalDownUp" = "Объем отправленного/полученного трафика" "totalDownUp" = "Общий объем отправленного/полученного трафика"
"totalUsage" = "Всего использовано" "totalUsage" = "Всего использовано"
"inboundCount" = "Всего входящих подключений" "inboundCount" = "Количество подключений"
"operate" = "Меню" "operate" = "Меню"
"enable" = "Включить" "enable" = "Включить"
"remark" = "Примечание" "remark" = "Примечание"
@ -139,20 +139,20 @@
"details" = "Подробнее" "details" = "Подробнее"
"transportConfig" = "Транспорт" "transportConfig" = "Транспорт"
"expireDate" = "Дата окончания" "expireDate" = "Дата окончания"
"resetTraffic" = "Сброс статистики трафика" "resetTraffic" = "Сбросить трафик"
"addInbound" = "Создать входящее подключение" "addInbound" = "Добавить подключение"
"generalActions" = "Общие действия" "generalActions" = "Общие действия"
"autoRefresh" = "Автообновление" "autoRefresh" = "Автообновление"
"autoRefreshInterval" = "Интервал" "autoRefreshInterval" = "Интервал"
"create" = "Создать" "create" = "Создать"
"update" = "Обновить" "update" = "Обновить"
"modifyInbound" = "Изменить входящее подключение" "modifyInbound" = "Изменить подключение"
"deleteInbound" = "Удалить входящее подключение" "deleteInbound" = "Удалить подключение"
"deleteInboundContent" = "Вы уверены, что хотите удалить входящее подключение?" "deleteInboundContent" = "Вы уверены, что хотите удалить подключение?"
"deleteClient" = "Удалить клиента" "deleteClient" = "Удалить клиента"
"deleteClientContent" = "Вы уверены, что хотите удалить клиента?" "deleteClientContent" = "Вы уверены, что хотите удалить клиента?"
"resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?" "resetTrafficContent" = "Вы уверены, что хотите сбросить трафик?"
"copyLink" = "Копировать ссылку" "copyLink" = "Копировать ключ"
"address" = "Адрес" "address" = "Адрес"
"network" = "Сеть" "network" = "Сеть"
"destinationPort" = "Порт назначения" "destinationPort" = "Порт назначения"
@ -162,36 +162,36 @@
"totalFlow" = "Общий расход" "totalFlow" = "Общий расход"
"leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало" "leaveBlankToNeverExpire" = "Оставьте пустым, чтобы не истекало"
"noRecommendKeepDefault" = "Рекомендуется оставить настройки по умолчанию" "noRecommendKeepDefault" = "Рекомендуется оставить настройки по умолчанию"
"certificatePath" = "Путь к сертификату" "certificatePath" = "Путь к файлу"
"certificateContent" = "Содержимое сертификата" "certificateContent" = "Содержимое файла"
"publicKey" = "Публичный ключ" "publicKey" = "Публичный ключ"
"privatekey" = "Закрытый ключ" "privatekey" = "Закрытый ключ"
"clickOnQRcode" = "Нажмите на QR-код, чтобы скопировать" "clickOnQRcode" = "Нажмите на QR-код, чтобы скопировать"
"client" = "Клиент" "client" = "Клиент"
"export" = "Экспорт ссылок" "export" = "Экспорт ключей"
"clone" = "Клонировать" "clone" = "Клонировать"
"cloneInbound" = "Клонировать" "cloneInbound" = "Клонировать"
"cloneInboundContent" = "Будут клонированы все настройки входящих подключений, за исключением списка клиентов, порта и IP-адреса прослушивания" "cloneInboundContent" = "Будут клонированы все настройки подключений, за исключением списка клиентов, порта и IP-адреса прослушивания"
"cloneInboundOk" = "Клонировано" "cloneInboundOk" = "Клонировано"
"resetAllTraffic" = "Сброс статистики всего трафика" "resetAllTraffic" = "Сбросить трафик всех подключений"
"resetAllTrafficTitle" = "Сброс трафика всех подключений" "resetAllTrafficTitle" = "Сброс трафика всех подключений"
"resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех входящих подключений?" "resetAllTrafficContent" = "Вы уверены, что хотите сбросить трафик всех подключений?"
"resetInboundClientTraffics" = "Сброс входящего трафика клиента" "resetInboundClientTraffics" = "Сбросить трафик пользователей"
"resetInboundClientTrafficTitle" = "Сброс трафика клиентов" "resetInboundClientTrafficTitle" = "Сброс трафика пользователей"
"resetInboundClientTrafficContent" = "Вы уверены, что хотите сбросить весь трафик для этих клиентов?" "resetInboundClientTrafficContent" = "Вы уверены, что хотите сбросить весь трафик для этих пользователей?"
"resetAllClientTraffics" = "Сброс трафик всех клиентов" "resetAllClientTraffics" = "Сбросить трафик всех пользователей"
"resetAllClientTrafficTitle" = "Сброс трафика всех клиентов" "resetAllClientTrafficTitle" = "Сброс трафика всех пользователей"
"resetAllClientTrafficContent" = "Вы уверены, что хотите сбросить трафик всех клиентов?" "resetAllClientTrafficContent" = "Вы уверены, что хотите сбросить трафик всех пользователей?"
"delDepletedClients" = "Удалить отключенных клиентов" "delDepletedClients" = "Удалить отключенных пользователей"
"delDepletedClientsTitle" = "Удаление отключенных клиентов" "delDepletedClientsTitle" = "Удаление отключенных пользователей"
"delDepletedClientsContent" = "Вы уверены, что хотите удалить всех отключенных клиентов?" "delDepletedClientsContent" = "Вы уверены, что хотите удалить всех отключенных пользователей?"
"email" = "Email" "email" = "Email"
"emailDesc" = "Пожалуйста, укажите уникальный Email" "emailDesc" = "Пожалуйста, укажите уникальный Email"
"IPLimit" = "Лимит по IP" "IPLimit" = "Лимит по IP"
"IPLimitDesc" = "Ограничение количества подключений с одного IP (0 отключить)" "IPLimitDesc" = "Ограничение количества подключений с одного IP (0 отключить)"
"IPLimitlog" = "Лог IP-адресов" "IPLimitlog" = "Лог IP-адресов"
"IPLimitlogDesc" = "Лог IP-адресов (перед включением лога IP-адресов, вы должны очистить список)" "IPLimitlogDesc" = "Лог IP-адресов (перед включением лога IP-адресов, вы должны очистить список)"
"IPLimitlogclear" = "Очистить журнал" "IPLimitlogclear" = "Очистить лог"
"setDefaultCert" = "Установить сертификат с панели" "setDefaultCert" = "Установить сертификат с панели"
"telegramDesc" = "Пожалуйста, укажите ID чата Telegram. (используйте команду '/id' в боте) или (@userinfobot)" "telegramDesc" = "Пожалуйста, укажите ID чата Telegram. (используйте команду '/id' в боте) или (@userinfobot)"
"subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций" "subscriptionDesc" = "Вы можете найти свою ссылку подписки в разделе 'Подробнее', также вы можете использовать одно и то же имя для нескольких конфигураций"
@ -200,14 +200,14 @@
"inboundData" = "Входящие данные" "inboundData" = "Входящие данные"
"exportInbound" = "Экспорт входящих" "exportInbound" = "Экспорт входящих"
"import" = "Импортировать" "import" = "Импортировать"
"importInbound" = "Импорт входящего подключения" "importInbound" = "Импортировать подключение"
[pages.client] [pages.client]
"add" = "Создать клиента" "add" = "Добавить пользователя"
"edit" = "Редактировать клиента" "edit" = "Редактировать пользователя"
"submitAdd" = "Добавить" "submitAdd" = "Добавить пользователя"
"submitEdit" = "Сохранить" "submitEdit" = "Сохранить изменения"
"clientCount" = "Количество клиентов" "clientCount" = "Количество пользователей"
"bulk" = "Добавить несколько" "bulk" = "Добавить несколько"
"method" = "Метод" "method" = "Метод"
"first" = "Первый" "first" = "Первый"
@ -344,12 +344,12 @@
"proxyAndServer" = "Прокси и сервер" "proxyAndServer" = "Прокси и сервер"
"intervals" = "Интервалы" "intervals" = "Интервалы"
"information" = "Информация" "information" = "Информация"
"language" = "Язык интерфейса" "language" = "Язык"
"telegramBotLanguage" = "Язык Telegram-бота" "telegramBotLanguage" = "Язык Telegram-бота"
[pages.xray] [pages.xray]
"title" = "Настройки Xray" "title" = "Настройки Xray"
"save" = "Сохранить" "save" = "Сохранить настройки"
"restart" = "Перезапустить Xray" "restart" = "Перезапустить Xray"
"basicTemplate" = "Базовый шаблон" "basicTemplate" = "Базовый шаблон"
"advancedTemplate" = "Расширенный шаблон" "advancedTemplate" = "Расширенный шаблон"
@ -358,16 +358,16 @@
"logConfigs" = "Журнал" "logConfigs" = "Журнал"
"logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!" "logConfigsDesc" = "Логи могут замедлять работу сервера. Включайте только нужные вам виды логов при необходимости!"
"blockConfigs" = "Блокировка конфигураций" "blockConfigs" = "Блокировка конфигураций"
"blockConfigsDesc" = "Эти параметры не позволят клиентам подключаться к определенным протоколам и веб-сайтам" "blockConfigsDesc" = "Эти параметры не позволят пользователям подключаться к определенным протоколам и веб-сайтам"
"basicRouting" = "Базовые соединения" "basicRouting" = "Базовые соединения"
"blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны." "blockConnectionsConfigsDesc" = "Эти параметры будут блокировать трафик в зависимости от запрашиваемой страны."
"directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер." "directConnectionsConfigsDesc" = "Прямое соединение гарантирует, что определенный трафик не будет перенаправлен через другой сервер."
"blockips" = "Заблокированные IP-адреса" "blockips" = "Блокировать IP-адреса"
"blockdomains" = "Заблокированные домены" "blockdomains" = "Блокировать домены"
"directips" = "Прямые IP-адреса" "directips" = "Прямые IP-адреса"
"directdomains" = "Прямые домены" "directdomains" = "Прямые домены"
"ipv4Routing" = "Правила IPv4" "ipv4Routing" = "Правила IPv4"
"ipv4RoutingDesc" = "Эти параметры позволят клиентам маршрутизироваться к целевым доменам только через IPv4" "ipv4RoutingDesc" = "Эти параметры позволят пользователям маршрутизироваться к целевым доменам только через IPv4"
"warpRouting" = "Правила WARP" "warpRouting" = "Правила WARP"
"warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare" "warpRoutingDesc" = "Внимание: перед использованием этих параметров установите WARP в режиме прокси-сервера socks5 на свой сервер, следуя инструкциям на GitHub панели. WARP будет направлять трафик на веб-сайты через серверы Cloudflare"
"Template" = "Шаблон конфигурации Xray" "Template" = "Шаблон конфигурации Xray"
@ -376,16 +376,16 @@
"FreedomStrategyDesc" = "Установка стратегии вывода сети в протоколе Freedom" "FreedomStrategyDesc" = "Установка стратегии вывода сети в протоколе Freedom"
"RoutingStrategy" = "Настройка стратегии маршрутизации доменов" "RoutingStrategy" = "Настройка стратегии маршрутизации доменов"
"RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS" "RoutingStrategyDesc" = "Установка общей стратегии маршрутизации разрешения DNS"
"Torrent" = "Заблокировать BitTorrent" "Torrent" = "Запрет использования BitTorrent"
"TorrentDesc" = "Запретить входящий/исходящий трафик, в котором фигурирует протокол BitTorrent" "TorrentDesc" = "Изменение шаблона конфигурации для предупреждения использования BitTorrent пользователями"
"Family" = "Семейный режим" "Family" = "Блокируйте вредоносное ПО и контент для взрослых"
"FamilyDesc" = "Использовать DNS-сервера Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи." "FamilyDesc" = "DNS-преобразователи Cloudflare для блокировки вредоносного ПО и контента для взрослых в целях защиты семьи."
"Inbounds" = "Входящее соединение" "Inbounds" = "Входящие"
"InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных клиентов" "InboundsDesc" = "Изменение шаблона конфигурации для подключения определенных пользователей"
"Outbounds" = "Исходящее соединение" "Outbounds" = "Исходящие"
"Balancers" = "Балансировщик" "Balancers" = "Балансировщик нагрузки"
"OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить исходящие пути для этого сервера" "OutboundsDesc" = "Изменение шаблона конфигурации, чтобы определить исходящие пути для этого сервера"
"Routings" = "Маршрутизация" "Routings" = "Правила маршрутизации"
"RoutingsDesc" = "Важен приоритет каждого правила!" "RoutingsDesc" = "Важен приоритет каждого правила!"
"completeTemplate" = "Все" "completeTemplate" = "Все"
"logLevel" = "Уровень журнала" "logLevel" = "Уровень журнала"
@ -394,9 +394,9 @@
"accessLogDesc" = "Путь к файлу журнала доступа. Специальное значение «none» отключает журналы доступа." "accessLogDesc" = "Путь к файлу журнала доступа. Специальное значение «none» отключает журналы доступа."
"errorLog" = "Журнал ошибок" "errorLog" = "Журнал ошибок"
"errorLogDesc" = "Путь к файлу журнала ошибок. Специальное значение «none» отключает журналы ошибок." "errorLogDesc" = "Путь к файлу журнала ошибок. Специальное значение «none» отключает журналы ошибок."
"dnsLog" = "Журнал DNS" "dnsLog" = "DNS Журнал"
"dnsLogDesc" = "Включить логи запросов DNS" "dnsLogDesc" = "Включить логи запросов DNS"
"maskAddress" = "Маскировка адреса" "maskAddress" = "Маскировать Адрес"
"maskAddressDesc" = "При активации реальный IP-адрес заменяется на маскировочный в логах." "maskAddressDesc" = "При активации реальный IP-адрес заменяется на маскировочный в логах."
"statistics" = "Статистика" "statistics" = "Статистика"
"statsInboundUplink" = "Статистика входящего аплинка" "statsInboundUplink" = "Статистика входящего аплинка"
@ -411,23 +411,23 @@
[pages.xray.rules] [pages.xray.rules]
"first" = "Первый" "first" = "Первый"
"last" = "Последний" "last" = "Последний"
"up" = "Поднять вверх" "up" = "Вверх"
"down" = "Опустить вниз" "down" = "Вниз"
"source" = "Источник" "source" = "Источник"
"dest" = "Пункт назначения" "dest" = "Пункт назначения"
"inbound" = "Входящее соединение" "inbound" = "Входящий"
"outbound" = "Исходящее соединение" "outbound" = "Исходящий"
"balancer" = "Балансировщик" "balancer" = "Балансировщик"
"info" = "Информация" "info" = "Информация"
"add" = "Создать правило" "add" = "Добавить правило"
"edit" = "Редактировать правило" "edit" = "Редактировать правило"
"useComma" = "Элементы, разделённые запятыми" "useComma" = "Элементы, разделённые запятыми"
[pages.xray.outbound] [pages.xray.outbound]
"addOutbound" = "Создать исходящее соединение" "addOutbound" = "Добавить исходящий"
"addReverse" = "Создать обратный прокси" "addReverse" = "Добавить реверс"
"editOutbound" = "Изменить исходящее соединение" "editOutbound" = "Изменить исходящий"
"editReverse" = "Редактировать обратное прокси" "editReverse" = "Редактировать реверс"
"tag" = "Тег" "tag" = "Тег"
"tagDesc" = "Уникальный тег" "tagDesc" = "Уникальный тег"
"address" = "Адрес" "address" = "Адрес"
@ -444,7 +444,7 @@
"sendThrough" = "Отправить через" "sendThrough" = "Отправить через"
[pages.xray.balancer] [pages.xray.balancer]
"addBalancer" = "Создать балансировщик" "addBalancer" = "Добавить балансировщик"
"editBalancer" = "Редактировать балансировщик" "editBalancer" = "Редактировать балансировщик"
"balancerStrategy" = "Стратегия" "balancerStrategy" = "Стратегия"
"balancerSelectors" = "Селекторы" "balancerSelectors" = "Селекторы"
@ -463,7 +463,7 @@
[pages.xray.dns] [pages.xray.dns]
"enable" = "Включить DNS" "enable" = "Включить DNS"
"enableDesc" = "Включить встроенный DNS-сервер" "enableDesc" = "Включить встроенный DNS-сервер"
"tag" = "Название тега DNS" "tag" = "Входящий тег DNS"
"tagDesc" = "Этот тег будет доступен как входящий тег в правилах маршрутизации." "tagDesc" = "Этот тег будет доступен как входящий тег в правилах маршрутизации."
"clientIp" = "IP клиента" "clientIp" = "IP клиента"
"clientIpDesc" = "Используется для уведомления сервера о указанном местоположении IP во время DNS-запросов" "clientIpDesc" = "Используется для уведомления сервера о указанном местоположении IP во время DNS-запросов"
@ -475,14 +475,14 @@
"disableFallbackIfMatchDesc" = "Отключает резервные DNS-запросы при совпадении списка доменов DNS-сервера" "disableFallbackIfMatchDesc" = "Отключает резервные DNS-запросы при совпадении списка доменов DNS-сервера"
"strategy" = "Стратегия запроса" "strategy" = "Стратегия запроса"
"strategyDesc" = "Общая стратегия разрешения доменных имен" "strategyDesc" = "Общая стратегия разрешения доменных имен"
"add" = "Создать DNS" "add" = "Добавить сервер"
"edit" = "Редактировать DNS" "edit" = "Редактировать сервер"
"domains" = "Домены" "domains" = "Домены"
"expectIPs" = "Ожидаемые IP" "expectIPs" = "Ожидаемые IP"
[pages.xray.fakedns] [pages.xray.fakedns]
"add" = "Создать Fake DNS" "add" = "Добавить поддельный DNS"
"edit" = "Редактировать Fake DNS" "edit" = "Редактировать поддельный DNS"
"ipPool" = "Подсеть пула IP" "ipPool" = "Подсеть пула IP"
"poolSize" = "Размер пула" "poolSize" = "Размер пула"
@ -584,22 +584,21 @@
"yes" = "✅ Да" "yes" = "✅ Да"
"no" = "❌ Нет" "no" = "❌ Нет"
"received_id" = "🔑📥 ID обновлен. Нажмите обновить, чтобы увидеть изменения." "received_id" = "🔑📥 Полученный ID: {{ .ClientId }}"
"received_password" = "🔑📥 Пароль обновлен. Нажмите обновить, чтобы увидеть изменения." "received_password" = "🔑📥 Полученный пароль: {{ .ClientPass }}"
"received_email" = "📧📥 Электронная почта обновлена. Нажмите обновить, чтобы увидеть изменения." "received_email" = "📧📥 Полученный email: {{ .ClientEmail }}"
"received_comment" = "💬📥 Комментарий обновлен. Нажмите обновить, чтобы увидеть изменения." "received_comment" = "💬📥 Полученный комментарий: {{ .ClientComment }}"
"id_prompt" = "🔑 ID по умолчанию: {{ .ClientId }}\n\nВведите ваш ID." "id_prompt" = "🔑 Стандартный ID: {{ .ClientId }}\n\nВведите ваш ID."
"pass_prompt" = "🔑 Пароль по умолчанию: {{ .ClientPassword }}\n\nВведите ваш пароль." "pass_prompt" = "🔑 Стандартный пароль: {{ .ClientPassword }}\n\nВведите ваш пароль."
"email_prompt" = "📧 Электронная почта по умолчанию: {{ .ClientEmail }}\n\nВведите ваш email." "email_prompt" = "📧 Стандартный email: {{ .ClientEmail }}\n\nВведите ваш email."
"comment_prompt" = "💬 Комментарий по умолчанию: {{ .ClientComment }}\n\nВведите ваш комментарий." "comment_prompt" = "💬 Стандартный комментарий: {{ .ClientComment }}\n\nВведите ваш комментарий."
"inbound_client_data_id" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "inbound_client_data_id" = "🔄 Входящий: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"inbound_client_data_pass" = "🔄 Входящие: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "inbound_client_data_pass" = "🔄 Входящий: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Электронная почта: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!" "client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Комментарий: {{ .ClientComment }}\n\nТеперь вы можете добавить клиента во входящие!"
"cancel" = "❌ Процесс отменен! \n\nВы можете /start снова в любое время. 🔄" "cancel" = "❌ Процесс отменен! \n\nВы можете начать заново в любое время с помощью /start. 🔄"
"error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}" "error_add_client" = "⚠️ Ошибка:\n\n {{ .error }}"
"using_default_value" = "Хорошо, я оставлю значение по умолчанию. 😊" "success_add_client" = "🏆 Успех! \nТеперь вы можете изменить его, используя кнопку 'Все клиенты'."
"incorrect_input" = "Ваш ввод недействителен.\nФразы должны быть непрерывными без пробелов.\nПравильный пример: aaaaaa\nНеправильный пример: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -633,17 +632,13 @@
"confirmNumber" = "✅ Подтвердить: {{ .Num }}" "confirmNumber" = "✅ Подтвердить: {{ .Num }}"
"confirmNumberAdd" = "✅ Подтвердить добавление: {{ .Num }}" "confirmNumberAdd" = "✅ Подтвердить добавление: {{ .Num }}"
"limitTraffic" = "🚧 Лимит трафика" "limitTraffic" = "🚧 Лимит трафика"
"getBanLogs" = "Журнал блокировок" "getBanLogs" = "Логи блокировок"
"allClients" = "Все клиенты" "allClients" = "Все клиенты"
"addClient" = "Добавить клиента" "addClient" = "Добавить клиента"
"submitDisable" = "Отправить как отключенный ✅" "submitDisable" = "Отправить как отключено ✅"
"use_default" = "🏷️ Использовать по умолчанию" "use_default" = "🏷️ Использовать по умолчанию"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Изменить по умолчанию"
"change_password" = "⚙️🔑 Пароль"
"change_email" = "⚙️📧 Электронная почта"
"change_comment" = "⚙️💬 Комментарий"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Успешно!" "successfulOperation" = "✅ Успешно!"
@ -665,5 +660,5 @@
"enableSuccess" = "✅ {{ .Email }}: Включено успешно." "enableSuccess" = "✅ {{ .Email }}: Включено успешно."
"disableSuccess" = "✅ {{ .Email }}: Отключено успешно." "disableSuccess" = "✅ {{ .Email }}: Отключено успешно."
"askToAddUserId" = "Ваша конфигурация не найдена!\r\nПожалуйста, попросите администратора использовать ваш идентификатор пользователя Telegram в ваших конфигурациях.\r\n\r\nВаш идентификатор пользователя: <code>{{ .TgUserID }}</code>" "askToAddUserId" = "Ваша конфигурация не найдена!\r\nПожалуйста, попросите администратора использовать ваш идентификатор пользователя Telegram в ваших конфигурациях.\r\n\r\nВаш идентификатор пользователя: <code>{{ .TgUserID }}</code>"
"chooseClient" = "Выберите клиента для подключения {{ .Inbound }}" "chooseClient" = "Выберите пользователя для подключения {{ .Inbound }}"
"chooseInbound" = "Выберите подключение" "chooseInbound" = "Выберите подключение"

View file

@ -584,22 +584,21 @@
"yes" = "✅ Evet" "yes" = "✅ Evet"
"no" = "❌ Hayır" "no" = "❌ Hayır"
"received_id" = "🔑📥 ID güncellendi. Değişiklikleri görmek için yenileyin." "received_id" = "🔑📥 Alınan Kimlik: {{ .ClientId }}"
"received_password" = "🔑📥 Şifre güncellendi. Değişiklikleri görmek için yenileyin." "received_password" = "🔑📥 Alınan Şifre: {{ .ClientPass }}"
"received_email" = "📧📥 E-posta güncellendi. Değişiklikleri görmek için yenileyin." "received_email" = "📧📥 Alınan E-posta: {{ .ClientEmail }}"
"received_comment" = "💬📥 Yorum güncellendi. Değişiklikleri görmek için yenileyin." "received_comment" = "💬📥 Alınan Yorum: {{ .ClientComment }}"
"id_prompt" = "🔑 Varsayılan ID: {{ .ClientId }}\n\nID'nizi girin." "id_prompt" = "🔑 Varsayılan Kimlik: {{ .ClientId }}\n\nKimliğinizi girin."
"pass_prompt" = "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin." "pass_prompt" = "🔑 Varsayılan Şifre: {{ .ClientPassword }}\n\nŞifrenizi girin."
"email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin." "email_prompt" = "📧 Varsayılan E-posta: {{ .ClientEmail }}\n\nE-posta adresinizi girin."
"comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin." "comment_prompt" = "💬 Varsayılan Yorum: {{ .ClientComment }}\n\nYorumunuzu girin."
"inbound_client_data_id" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!" "inbound_client_data_id" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!"
"inbound_client_data_pass" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!" "inbound_client_data_pass" = "🔄 Gelen: {{ .InboundRemark }}\n\n🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!" "client_data_id" = "🔑 Kimlik: {{ .ClientId }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!"
"client_data_pass" = "🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nŞimdi müşteri gelen kutusuna eklenebilir!" "client_data_pass" = "🔑 Şifre: {{ .ClientPass }}\n📧 E-posta: {{ .ClientEmail }}\n💬 Yorum: {{ .ClientComment }}\n\nArtık müşteriyi gelen kutusuna ekleyebilirsiniz!"
"cancel" = "❌ İşlem iptal edildi! \n\nHer zaman /start ile tekrar başlayabilirsiniz. 🔄" "cancel" = "❌ İşlem iptal edildi! \n\nİstediğiniz zaman /start kullanabilirsiniz. 🔄"
"error_add_client" = "⚠️ Hata:\n\n {{ .error }}" "error_add_client" = "⚠️ Hata:\n\n {{ .error }}"
"using_default_value" = "Tamam, varsayılan değeri kullanacağım. 😊" "success_add_client" = "🏆 Başarılı! \nArtık 'Tüm Müşteriler' düğmesini kullanarak düzenleyebilirsiniz."
"incorrect_input" = "Girdiğiniz geçersiz.\nCümleler boşluk olmadan ardışık olmalıdır.\nDoğru örnek: aaaaaa\nYanlış örnek: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "Müşteri Ekle" "addClient" = "Müşteri Ekle"
"submitDisable" = "Devre Dışı Olarak Gönder ✅" "submitDisable" = "Devre Dışı Olarak Gönder ✅"
"use_default" = "🏷️ Varsayılanı Kullan" "use_default" = "🏷️ Varsayılanı Kullan"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Varsayılanı Değiştir"
"change_password" = "⚙️🔑 Şifre"
"change_email" = "⚙️📧 E-posta"
"change_comment" = "⚙️💬 Yorum"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ İşlem başarılı!" "successfulOperation" = "✅ İşlem başarılı!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ Так" "yes" = "✅ Так"
"no" = "❌ Ні" "no" = "❌ Ні"
"received_id" = "🔑📥 ID оновлено. Натисніть оновити, щоб побачити зміни." "received_id" = "🔑📥 Отриманий ID: {{ .ClientId }}"
"received_password" = "🔑📥 Пароль оновлено. Натисніть оновити, щоб побачити зміни." "received_password" = "🔑📥 Отриманий пароль: {{ .ClientPass }}"
"received_email" = "📧📥 Електронну пошту оновлено. Натисніть оновити, щоб побачити зміни." "received_email" = "📧📥 Отриманий email: {{ .ClientEmail }}"
"received_comment" = "💬📥 Коментар оновлено. Натисніть оновити, щоб побачити зміни." "received_comment" = "💬📥 Отриманий коментар: {{ .ClientComment }}"
"id_prompt" = "🔑 ID за замовчуванням: {{ .ClientId }}\n\nВведіть свій ID." "id_prompt" = "🔑 Стандартний ID: {{ .ClientId }}\n\nВведіть ваш ID."
"pass_prompt" = "🔑 Пароль за замовчуванням: {{ .ClientPassword }}\n\nВведіть свій пароль." "pass_prompt" = "🔑 Стандартний пароль: {{ .ClientPassword }}\n\nВведіть ваш пароль."
"email_prompt" = "📧 Електронна пошта за замовчуванням: {{ .ClientEmail }}\n\nВведіть свою електронну пошту." "email_prompt" = "📧 Стандартний email: {{ .ClientEmail }}\n\nВведіть ваш email."
"comment_prompt" = "💬 Коментар за замовчуванням: {{ .ClientComment }}\n\nВведіть свій коментар." "comment_prompt" = "💬 Стандартний коментар: {{ .ClientComment }}\n\nВведіть ваш коментар."
"inbound_client_data_id" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "inbound_client_data_id" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"inbound_client_data_pass" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "inbound_client_data_pass" = "🔄 Вхідні: {{ .InboundRemark }}\n\n🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Електронна пошта: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!" "client_data_pass" = "🔑 Пароль: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Коментар: {{ .ClientComment }}\n\nТепер ви можете додати клієнта до вхідних!"
"cancel" = "❌ Процес скасовано! \n\nВи можете /start знову в будь-який час. 🔄" "cancel" = "❌ Процес скасовано! \n\nВи можете використати /start у будь-який час. 🔄"
"error_add_client" = "⚠️ Помилка:\n\n {{ .error }}" "error_add_client" = "⚠️ Помилка:\n\n {{ .error }}"
"using_default_value" = "Добре, я залишу значення за замовчуванням. 😊" "success_add_client" = "🏆 Успіх! \nТепер ви можете редагувати його за допомогою кнопки 'Усі клієнти'."
"incorrect_input" = "Ваш ввід недійсний.\nФрази повинні йти без пробілів.\nПравильний приклад: aaaaaa\nНеправильний приклад: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -637,13 +636,9 @@
"allClients" = "Всі Клієнти" "allClients" = "Всі Клієнти"
"addClient" = "Додати клієнта" "addClient" = "Додати клієнта"
"submitDisable" = "Надіслати як вимкнене ✅" "submitDisable" = "Надіслати як вимкнено ✅"
"use_default" = "🏷️ Використовувати за замовчуванням" "use_default" = "🏷️ Використати за замовчуванням"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Змінити за замовчуванням"
"change_password" = "⚙️🔑 Пароль"
"change_email" = "⚙️📧 Електронна пошта"
"change_comment" = "⚙️💬 Коментар"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Операція успішна!" "successfulOperation" = "✅ Операція успішна!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ Có" "yes" = "✅ Có"
"no" = "❌ Không" "no" = "❌ Không"
"received_id" = "🔑📥 ID đã được cập nhật. Nhấn làm mới để xem thay đổi." "received_id" = "🔑📥 ID nhận được: {{ .ClientId }}"
"received_password" = "🔑📥 Mật khẩu đã được cập nhật. Nhấn làm mới để xem thay đổi." "received_password" = "🔑📥 Mật khẩu nhận được: {{ .ClientPass }}"
"received_email" = "📧📥 Email đã được cập nhật. Nhấn làm mới để xem thay đổi." "received_email" = "📧📥 Email nhận được: {{ .ClientEmail }}"
"received_comment" = "💬📥 Bình luận đã được cập nhật. Nhấn làm mới để xem thay đổi." "received_comment" = "💬📥 Bình luận nhận được: {{ .ClientComment }}"
"id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn." "id_prompt" = "🔑 ID mặc định: {{ .ClientId }}\n\nNhập ID của bạn."
"pass_prompt" = "🔑 Mật khẩu mặc định: {{ .ClientPassword }}\n\nNhập mật khẩu của bạn." "pass_prompt" = "🔑 Mật khẩu mặc định: {{ .ClientPassword }}\n\nNhập mật khẩu của bạn."
"email_prompt" = "📧 Email mặc định: {{ .ClientEmail }}\n\nNhập email của bạn." "email_prompt" = "📧 Email mặc định: {{ .ClientEmail }}\n\nNhập email của bạn."
"comment_prompt" = "💬 Bình luận mặc định: {{ .ClientComment }}\n\nNhập bình luận của bạn." "comment_prompt" = "💬 Bình luận mặc định: {{ .ClientComment }}\n\nNhập bình luận của bạn."
"inbound_client_data_id" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!" "inbound_client_data_id" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!"
"inbound_client_data_pass" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!" "inbound_client_data_pass" = "🔄 Dữ liệu đến: {{ .InboundRemark }}\n\n🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!"
"client_data_pass" = "🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào inbound ngay bây giờ!" "client_data_pass" = "🔑 Mật khẩu: {{ .ClientPass }}\n📧 Email: {{ .ClientEmail }}\n💬 Bình luận: {{ .ClientComment }}\n\nBạn có thể thêm khách hàng vào danh sách đến ngay bây giờ!"
"cancel" = "❌ Quá trình đã hủy! \n\nBạn có thể /start lại bất cứ lúc nào. 🔄" "cancel" = "❌ Quá trình đã bị hủy! \n\nBạn có thể sử dụng /start bất cứ lúc nào. 🔄"
"error_add_client" = "⚠️ Lỗi:\n\n {{ .error }}" "error_add_client" = "⚠️ Lỗi:\n\n {{ .error }}"
"using_default_value" = "Được rồi, tôi sẽ giữ giá trị mặc định. 😊" "success_add_client" = "🏆 Thành công! \nGiờ đây bạn có thể chỉnh sửa bằng nút 'Tất Cả Khách Hàng'."
"incorrect_input" = "Dữ liệu bạn nhập không hợp lệ.\nCác cụm từ phải liên tiếp mà không có khoảng trắng.\nVí dụ đúng: aaaaaa\nVí dụ sai: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "Thêm Khách Hàng" "addClient" = "Thêm Khách Hàng"
"submitDisable" = "Gửi Dưới Dạng Tắt ✅" "submitDisable" = "Gửi Dưới Dạng Tắt ✅"
"use_default" = "🏷️ Sử dụng mặc định" "use_default" = "🏷️ Sử dụng mặc định"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ Thay đổi mặc định"
"change_password" = "⚙️🔑 Mật khẩu"
"change_email" = "⚙️📧 Email"
"change_comment" = "⚙️💬 Bình luận"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ Thành công!" "successfulOperation" = "✅ Thành công!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ 是的" "yes" = "✅ 是的"
"no" = "❌ 没有" "no" = "❌ 没有"
"received_id" = "🔑📥 ID 已更新。请点击刷新查看更改。" "received_id" = "🔑📥 接收到的ID: {{ .ClientId }}"
"received_password" = "🔑📥 密码已更新。请点击刷新查看更改。" "received_password" = "🔑📥 接收到的密码: {{ .ClientPass }}"
"received_email" = "📧📥 电子邮件已更新。请点击刷新查看更改。" "received_email" = "📧📥 接收到的电子邮件: {{ .ClientEmail }}"
"received_comment" = "💬📥 评论已更新。请点击刷新查看更改。" "received_comment" = "💬📥 接收到的评论: {{ .ClientComment }}"
"id_prompt" = "🔑 默认 ID: {{ .ClientId }}\n\n请输入您的 ID。" "id_prompt" = "🔑 默认ID: {{ .ClientId }}\n\n请输入您的ID。"
"pass_prompt" = "🔑 默认密码: {{ .ClientPassword }}\n\n请输入您的密码。" "pass_prompt" = "🔑 默认密码: {{ .ClientPassword }}\n\n请输入您的密码。"
"email_prompt" = "📧 默认电子邮件: {{ .ClientEmail }}\n\n请输入您的电子邮件。" "email_prompt" = "📧 默认电子邮件: {{ .ClientEmail }}\n\n请输入您的电子邮件。"
"comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。" "comment_prompt" = "💬 默认评论: {{ .ClientComment }}\n\n请输入您的评论。"
"inbound_client_data_id" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中" "inbound_client_data_id" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表"
"inbound_client_data_pass" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中" "inbound_client_data_pass" = "🔄 传入数据: {{ .InboundRemark }}\n\n🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表"
"client_data_pass" = "🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n现在可以将客户添加到传入数据中" "client_data_pass" = "🔑 密码: {{ .ClientPass }}\n📧 电子邮件: {{ .ClientEmail }}\n💬 评论: {{ .ClientComment }}\n\n您现在可以将客户添加到传入列表"
"cancel" = "❌ 过程已取消! \n\n您可以随时重新开始 /start。 🔄" "cancel" = "❌ 过程已取消!\n\n您可以随时使用 /start。 🔄"
"error_add_client" = "⚠️ 错误:\n\n {{ .error }}" "error_add_client" = "⚠️ 错误:\n\n {{ .error }}"
"using_default_value" = "好的,我将使用默认值。😊" "success_add_client" = "🏆 成功!\n您现在可以使用'所有客户'按钮进行修改。"
"incorrect_input" = "您的输入无效。\n短语应连续无空格。\n正确示例: aaaaaa\n错误示例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "添加客户" "addClient" = "添加客户"
"submitDisable" = "提交为禁用 ✅" "submitDisable" = "提交为禁用 ✅"
"use_default" = "🏷️ 使用默认" "use_default" = "🏷️ 使用默认"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ 更改默认"
"change_password" = "⚙️🔑 密码"
"change_email" = "⚙️📧 邮箱"
"change_comment" = "⚙️💬 评论"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

View file

@ -584,22 +584,21 @@
"yes" = "✅ 是的" "yes" = "✅ 是的"
"no" = "❌ 沒有" "no" = "❌ 沒有"
"received_id" = "🔑📥 ID 已更新。請按刷新查看變更。" "received_id" = "🔑📥 接收到的 ID: {{ .ClientId }}"
"received_password" = "🔑📥 密碼已更新。請按刷新查看變更。" "received_password" = "🔑📥 接收到的密碼: {{ .ClientPass }}"
"received_email" = "📧📥 電子郵件已更新。請按刷新查看變更。" "received_email" = "📧📥 接收到的電子郵件: {{ .ClientEmail }}"
"received_comment" = "💬📥 評論已更新。請按刷新查看變更。" "received_comment" = "💬📥 接收到的評論: {{ .ClientComment }}"
"id_prompt" = "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。" "id_prompt" = "🔑 預設 ID: {{ .ClientId }}\n\n請輸入您的 ID。"
"pass_prompt" = "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。" "pass_prompt" = "🔑 預設密碼: {{ .ClientPassword }}\n\n請輸入您的密碼。"
"email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。" "email_prompt" = "📧 預設電子郵件: {{ .ClientEmail }}\n\n請輸入您的電子郵件。"
"comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。" "comment_prompt" = "💬 預設評論: {{ .ClientComment }}\n\n請輸入您的評論。"
"inbound_client_data_id" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中" "inbound_client_data_id" = "🔄 傳入數據: {{ .InboundRemark }}\n\n🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表"
"inbound_client_data_pass" = "🔄 進來資料: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中" "inbound_client_data_pass" = "🔄 傳入數據: {{ .InboundRemark }}\n\n🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表"
"client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中" "client_data_id" = "🔑 ID: {{ .ClientId }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表"
"client_data_pass" = "🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n現在您可以將客戶添加到進來資料中" "client_data_pass" = "🔑 密碼: {{ .ClientPass }}\n📧 電子郵件: {{ .ClientEmail }}\n💬 評論: {{ .ClientComment }}\n\n您現在可以將客戶添加到傳入列表"
"cancel" = "❌ 處理已取消! \n\n您可以隨時重新開始 /start。 🔄" "cancel" = "❌ 過程已取消!\n\n您可以隨時使用 /start。 🔄"
"error_add_client" = "⚠️ 錯誤:\n\n {{ .error }}" "error_add_client" = "⚠️ 錯誤:\n\n {{ .error }}"
"using_default_value" = "好的,我會使用預設值。😊" "success_add_client" = "🏆 成功!\n您現在可以使用'所有客戶'按鈕進行修改。"
"incorrect_input" = "您的輸入無效。\n短語應該連貫而不應有空格。\n正確範例: aaaaaa\n錯誤範例: aaa aaa 🚫"
[tgbot.buttons] [tgbot.buttons]
@ -639,11 +638,7 @@
"addClient" = "新增客戶" "addClient" = "新增客戶"
"submitDisable" = "提交為停用 ✅" "submitDisable" = "提交為停用 ✅"
"use_default" = "🏷️ 使用預設" "use_default" = "🏷️ 使用預設"
"change_id" = "⚙️🔑 ID" "change_default" = "🔄⚙️ 更改預設"
"change_password" = "⚙️🔑 密碼"
"change_email" = "⚙️📧 電子郵件"
"change_comment" = "⚙️💬 評論"
[tgbot.answers] [tgbot.answers]
"successfulOperation" = "✅ 成功!" "successfulOperation" = "✅ 成功!"

90
x-ui.sh
View file

@ -25,28 +25,92 @@ function LOGI() {
# Check OS and set release variable # Check OS and set release variable
if [[ -f /etc/os-release ]]; then if [[ -f /etc/os-release ]]; then
source /etc/os-release source /etc/os-release
release=$PRETTY_NAME release=$ID
elif [[ -f /usr/lib/os-release ]]; then elif [[ -f /usr/lib/os-release ]]; then
source /usr/lib/os-release source /usr/lib/os-release
release=$PRETTY_NAME release=$ID
else else
echo "Failed to check the system OS, please contact the author!" >&2 echo "Failed to check the system OS, please contact the author!" >&2
exit 1 exit 1
fi fi
echo "The OS release is: $release" echo "The OS release is: $release"
check_glibc_version() { os_version=""
glibc_version=$(ldd --version | head -n1 | awk '{print $NF}') os_version=$(grep "^VERSION_ID" /etc/os-release | cut -d '=' -f2 | tr -d '"' | tr -d '.')
required_version="2.32" if [[ "${release}" == "arch" ]]; then
if [[ "$(printf '%s\n' "$required_version" "$glibc_version" | sort -V | head -n1)" != "$required_version" ]]; then echo "Your OS is Arch Linux"
echo -e "${red}GLIBC version $glibc_version is too old! Required: 2.32 or higher${plain}" elif [[ "${release}" == "parch" ]]; then
echo "Please upgrade to a newer version of your operating system to get a higher GLIBC version." echo "Your OS is Parch Linux"
exit 1 elif [[ "${release}" == "manjaro" ]]; then
echo "Your OS is Manjaro"
elif [[ "${release}" == "armbian" ]]; then
echo "Your OS is Armbian"
elif [[ "${release}" == "alpine" ]]; then
echo "Your OS is Alpine Linux"
elif [[ "${release}" == "opensuse-tumbleweed" ]]; then
echo "Your OS is OpenSUSE Tumbleweed"
elif [[ "${release}" == "openEuler" ]]; then
if [[ ${os_version} -lt 2203 ]]; then
echo -e "${red} Please use OpenEuler 22.03 or higher ${plain}\n" && exit 1
fi fi
echo "GLIBC version: $glibc_version (meets requirement of 2.32+)" elif [[ "${release}" == "centos" ]]; then
} if [[ ${os_version} -lt 8 ]]; then
check_glibc_version echo -e "${red} Please use CentOS 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "ubuntu" ]]; then
if [[ ${os_version} -lt 2204 ]]; then
echo -e "${red} Please use Ubuntu 22 or higher version!${plain}\n" && exit 1
fi
elif [[ "${release}" == "fedora" ]]; then
if [[ ${os_version} -lt 36 ]]; then
echo -e "${red} Please use Fedora 36 or higher version!${plain}\n" && exit 1
fi
elif [[ "${release}" == "amzn" ]]; then
if [[ ${os_version} != "2023" ]]; then
echo -e "${red} Please use Amazon Linux 2023!${plain}\n" && exit 1
fi
elif [[ "${release}" == "debian" ]]; then
if [[ ${os_version} -lt 12 ]]; then
echo -e "${red} Please use Debian 12 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "almalinux" ]]; then
if [[ ${os_version} -lt 80 ]]; then
echo -e "${red} Please use AlmaLinux 8.0 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "rocky" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Rocky Linux 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "ol" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Oracle Linux 8 or higher ${plain}\n" && exit 1
fi
elif [[ "${release}" == "virtuozzo" ]]; then
if [[ ${os_version} -lt 8 ]]; then
echo -e "${red} Please use Virtuozzo Linux 8 or higher ${plain}\n" && exit 1
fi
else
echo -e "${red}Your operating system is not supported by this script.${plain}\n"
echo "Please ensure you are using one of the following supported operating systems:"
echo "- Ubuntu 22.04+"
echo "- Debian 12+"
echo "- CentOS 8+"
echo "- OpenEuler 22.03+"
echo "- Fedora 36+"
echo "- Arch Linux"
echo "- Parch Linux"
echo "- Manjaro"
echo "- Armbian"
echo "- AlmaLinux 8.0+"
echo "- Rocky Linux 8+"
echo "- Oracle Linux 8+"
echo "- OpenSUSE Tumbleweed"
echo "- Amazon Linux 2023"
echo "- Virtuozzo Linux 8+"
exit 1
fi
# Declare Variables # Declare Variables
log_folder="${XUI_LOG_FOLDER:=/var/log}" log_folder="${XUI_LOG_FOLDER:=/var/log}"