feat: добавлена поддержка шаблонов $0 и \$0 для наград в задачах (v3.1.1)
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 44s
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 44s
This commit is contained in:
@@ -7290,17 +7290,47 @@ func (a *App) completeTaskHandler(w http.ResponseWriter, r *http.Request) {
|
||||
rewardStrings[reward.Position] = rewardStr
|
||||
}
|
||||
|
||||
// Подставляем в reward_message основной задачи
|
||||
var mainTaskMessage string
|
||||
if task.RewardMessage != nil && *task.RewardMessage != "" {
|
||||
mainTaskMessage = *task.RewardMessage
|
||||
// Заменяем плейсхолдеры ${0}, ${1}, и т.д.
|
||||
// Функция для замены плейсхолдеров в сообщении награды
|
||||
replaceRewardPlaceholders := func(message string, rewardStrings map[int]string) string {
|
||||
result := message
|
||||
// Сначала сохраняем экранированные плейсхолдеры \$0, \$1 и т.д. во временные маркеры
|
||||
escapedMarkers := make(map[string]string)
|
||||
for i := 0; i < 100; i++ {
|
||||
escaped := fmt.Sprintf(`\$%d`, i)
|
||||
marker := fmt.Sprintf(`__ESCAPED_DOLLAR_%d__`, i)
|
||||
if strings.Contains(result, escaped) {
|
||||
escapedMarkers[marker] = escaped
|
||||
result = strings.ReplaceAll(result, escaped, marker)
|
||||
}
|
||||
}
|
||||
// Заменяем ${0}, ${1}, и т.д.
|
||||
for i := 0; i < 100; i++ { // Максимум 100 плейсхолдеров
|
||||
placeholder := fmt.Sprintf("${%d}", i)
|
||||
if rewardStr, ok := rewardStrings[i]; ok {
|
||||
mainTaskMessage = strings.ReplaceAll(mainTaskMessage, placeholder, rewardStr)
|
||||
result = strings.ReplaceAll(result, placeholder, rewardStr)
|
||||
}
|
||||
}
|
||||
// Затем заменяем $0, $1, и т.д. (экранированные уже защищены маркерами)
|
||||
// Используем регулярное выражение для поиска $N, где после N не идет еще одна цифра
|
||||
for i := 0; i < 100; i++ {
|
||||
if rewardStr, ok := rewardStrings[i]; ok {
|
||||
// Паттерн: $N, где после N не идет еще одна цифра (чтобы не заменить $10 при поиске $1)
|
||||
pattern := fmt.Sprintf(`\$%d(?!\d)`, i)
|
||||
re := regexp.MustCompile(pattern)
|
||||
result = re.ReplaceAllString(result, rewardStr)
|
||||
}
|
||||
}
|
||||
// Восстанавливаем экранированные доллары из временных маркеров
|
||||
for marker, escaped := range escapedMarkers {
|
||||
result = strings.ReplaceAll(result, marker, escaped)
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// Подставляем в reward_message основной задачи
|
||||
var mainTaskMessage string
|
||||
if task.RewardMessage != nil && *task.RewardMessage != "" {
|
||||
mainTaskMessage = replaceRewardPlaceholders(*task.RewardMessage, rewardStrings)
|
||||
} else {
|
||||
// Если reward_message пустой, используем имя задачи
|
||||
mainTaskMessage = task.Name
|
||||
@@ -7394,13 +7424,7 @@ func (a *App) completeTaskHandler(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
// Подставляем в reward_message подзадачи
|
||||
subtaskMessage := subtaskRewardMessage.String
|
||||
for i := 0; i < 100; i++ {
|
||||
placeholder := fmt.Sprintf("${%d}", i)
|
||||
if rewardStr, ok := subtaskRewardStrings[i]; ok {
|
||||
subtaskMessage = strings.ReplaceAll(subtaskMessage, placeholder, rewardStr)
|
||||
}
|
||||
}
|
||||
subtaskMessage := replaceRewardPlaceholders(subtaskRewardMessage.String, subtaskRewardStrings)
|
||||
|
||||
subtaskMessages = append(subtaskMessages, subtaskMessage)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user