Больше чем ИИ, поражает возможность вставлять в код эмодзи. Мне сейчас 33 года, в программировать я начал в 11 или 12 лет, на basic. У меня тогда сложились определённые представления и привычки, и вставка эмодзи в код диссонирует с ними. Но сама такая возможность многое упрощает.
func processDialog(dialogS DialogSettings, request tgRequest, InputChan <-chan tgRequest, AnswersChan chan<- tgRequest) {
// Горутина принимает: Настроки диалога, конкретный запрос на который надо ответить, канал через который принимает сообщения пользователя и канал в который посылает ответы на сообщения.
var count float64 // Количество товара
var err error
var Answer tgRequest
var vendorCode string
var resultCommand string
if dialogS.NameDialog == dialogReserveCount { // Резервирование или снятие с резерва
vendorCode = dialogS.Good.VendorCode // Артикул товара
request.MessageReplyID = 0 // Что бы не ссылаться на конкретное сообщение.
request.Responses = append(request.Responses, dialogS.Description) // Добавление описания
if dialogS.ReservationFlag > 0 { // резервирование
request.Responses = append(request.Responses, fmt.Sprintf("Сколько товара %s зарезервировать?", vendorCode))
}
if dialogS.ReservationFlag < 0 { // Снятие с резерва
request.Responses = append(request.Responses, fmt.Sprintf("Сколько товара %s снять с резерва?", vendorCode))
}
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{fmt.Sprintf("❌ Отмена ввода.")}, []string{"cancel"})
AnswersChan <- request // Отправка этих текстов.
for Answer.StopGo { // Типа для выхода, но буду использовать break
Answer = <-InputChan // Принимаем сообщения, ожидание.
if Answer.TextRequest == "cancel" || Answer.StopGo { // Досрочный выход
if Answer.StopGo {
Answer.Responses = append(Answer.Responses, "Диалог остановлен. "+menuCommand)
} else {
Answer.Responses = append(Answer.Responses, "Операция отменена. "+menuCommand)
}
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{"➡️ Продолжить..."}, []string{dialogS.CancelCommand})
Answer.CloseRequest = true
AnswersChan <- Answer
return
}
if Answer.TextRequest == "ok" { // Число подтверждено
if count != 0 { // Число получено
break
} else { // Число не получено
if err == nil { // Число не должно быть нулём
Answer.Responses = append(Answer.Responses, "Число не должно быть нулём.")
}
}
}
if count == 0 {
count, err = strconv.ParseFloat(strings.ReplaceAll(Answer.TextRequest, ",", "."), 64)
if err != nil { // Число не распознано
Answer.Responses = append(Answer.Responses, "Число не распознано. Оно должно состоять из цифр.")
}
}
if count != 0 {
resultCommand = "/reservation " + vendorCode + " " + fmt.Sprintf("%g", count)
Answer.Responses = append(Answer.Responses, "Если число распознано не верно, попробуйте ввести его ещё раз по другому.")
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{fmt.Sprintf("✅ Число %g распознано верно.", count)}, []string{"ok"})
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{"❌ Отмена ввода."}, []string{"cancel"})
}
if Answer.Responses != nil {
if len(Answer.Responses) > 0 { // Есть чем отвечать
AnswersChan <- Answer
}
}
}
if len(resultCommand) > 0 { // Пользователь таки ввёл число
Answer.CloseRequest = true // Перестать перенавправлять сообщения в эту горутину.
Answer.Responses = append(Answer.Responses, "Синтезирована команда:"+resultCommand)
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{fmt.Sprintf("✔️ Зарезервировать %g едениц товара %s.", count, vendorCode)}, []string{resultCommand})
Answer.tgKeyboard = addInlineKeyboardRow(Answer.tgKeyboard, []string{"➡️ Продолжить..."}, []string{dialogS.CancelCommand})
AnswersChan <- Answer // Ответ с кнопкой в которой сформированная команда.
}
}
}
Ну и конечно ответы chatGPT выполняют роль психологической поддержки:
Ваша функция выглядит хорошо и включает в себя логику обработки диалога с пользователем по резервированию товара. Здесь некоторые замечания и рекомендации:
Похоже, что вы используете break для выхода из цикла. Использование break в данном контексте вполне допустимо, но будьте внимательны при использовании break в более сложных структурах кода, так как это может усложнить понимание логики выполнения программы.
Помните, что Answer.StopGo изначально будет равно нулю (по умолчанию), и в первой итерации цикла у вас не будет выхода. Возможно, вы захотите установить Answer.StopGo в true до входа в цикл, если есть определенные условия для досрочного выхода.
Обратите внимание, что вы проверяете len(Answer.Responses) > 0, но также может быть полезно проверить Answer.TextRequest != "" перед отправкой ответа, чтобы избежать отправки пустых сообщений.
Помните, что resultCommand не обнуляется в каждой итерации цикла, поэтому если len(resultCommand) > 0, вы будете выполнять этот блок кода после выхода из цикла. Рассмотрите возможность обнуления resultCommand перед использованием.
Ваш код хорошо структурирован и читаем. Он содержит комментарии, что делает его более понятным для других разработчиков. Важно продолжать поддерживать хорошую читаемость кода, особенно когда проект становится более сложным.