+18
-14
@@ -67,14 +67,13 @@ func (bot *Bot[T]) executeScene(ctx *SceneContext, scene *Scene[T]) (bool, error
|
||||
res, _, err := scene.executeCommand(cmd, ctx, bot.appData)
|
||||
if err != nil {
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneCommandKind, cmd, startTime, err)
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneCommandKind, cmd, err)
|
||||
return false, err
|
||||
return false, bot.emitSceneError(ctx, scene, HandlerSceneCommandKind, cmd, err)
|
||||
}
|
||||
from := ctx.sess.Step
|
||||
ok, err := bot.applySceneResult(scene, ctx, res)
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneCommandKind, cmd, startTime, err)
|
||||
if err != nil {
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneCommandKind, cmd, err)
|
||||
err = bot.emitSceneError(ctx, scene, HandlerSceneCommandKind, cmd, err)
|
||||
}
|
||||
if ok {
|
||||
bot.emitSceneTransition(ctx, scene, from, res)
|
||||
@@ -101,14 +100,13 @@ func (bot *Bot[T]) executeScene(ctx *SceneContext, scene *Scene[T]) (bool, error
|
||||
res, _, err := scene.executePayload(cmd, ctx, bot.appData)
|
||||
if err != nil {
|
||||
bot.emitSceneFinished(ctx, scene, HandlerScenePayloadKind, cmd, startTime, err)
|
||||
bot.emitSceneError(ctx, scene, HandlerScenePayloadKind, cmd, err)
|
||||
return false, err
|
||||
return false, bot.emitSceneError(ctx, scene, HandlerScenePayloadKind, cmd, err)
|
||||
}
|
||||
from := ctx.sess.Step
|
||||
ok, err := bot.applySceneResult(scene, ctx, res)
|
||||
bot.emitSceneFinished(ctx, scene, HandlerScenePayloadKind, cmd, startTime, err)
|
||||
if err != nil {
|
||||
bot.emitSceneError(ctx, scene, HandlerScenePayloadKind, cmd, err)
|
||||
err = bot.emitSceneError(ctx, scene, HandlerScenePayloadKind, cmd, err)
|
||||
}
|
||||
if ok {
|
||||
bot.emitSceneTransition(ctx, scene, from, res)
|
||||
@@ -132,14 +130,13 @@ func (bot *Bot[T]) executeScene(ctx *SceneContext, scene *Scene[T]) (bool, error
|
||||
res, _, err := scene.executeStep(step, ctx, bot.appData)
|
||||
if err != nil {
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneStepKind, step, startTime, err)
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneStepKind, step, err)
|
||||
return false, err
|
||||
return false, bot.emitSceneError(ctx, scene, HandlerSceneStepKind, step, err)
|
||||
}
|
||||
from := step
|
||||
ok, err := bot.applySceneResult(scene, ctx, res)
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneStepKind, step, startTime, err)
|
||||
if err != nil {
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneStepKind, from, err)
|
||||
err = bot.emitSceneError(ctx, scene, HandlerSceneStepKind, from, err)
|
||||
}
|
||||
if ok {
|
||||
bot.emitSceneTransition(ctx, scene, from, res)
|
||||
@@ -154,14 +151,13 @@ func (bot *Bot[T]) executeScene(ctx *SceneContext, scene *Scene[T]) (bool, error
|
||||
res, _, err := scene.executeMessage(ctx, bot.appData)
|
||||
if err != nil {
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneMessageKind, "message_fallback", startTime, err)
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneMessageKind, "message_fallback", err)
|
||||
return false, err
|
||||
return false, bot.emitSceneError(ctx, scene, HandlerSceneMessageKind, "message_fallback", err)
|
||||
}
|
||||
from := ctx.sess.Step
|
||||
ok, err := bot.applySceneResult(scene, ctx, res)
|
||||
bot.emitSceneFinished(ctx, scene, HandlerSceneMessageKind, "message_fallback", startTime, err)
|
||||
if err != nil {
|
||||
bot.emitSceneError(ctx, scene, HandlerSceneMessageKind, "message_fallback", err)
|
||||
err = bot.emitSceneError(ctx, scene, HandlerSceneMessageKind, "message_fallback", err)
|
||||
}
|
||||
if ok {
|
||||
bot.emitSceneTransition(ctx, scene, from, res)
|
||||
@@ -199,7 +195,14 @@ func (bot *Bot[T]) emitSceneFinished(ctx *SceneContext, scene *Scene[T], kind Ha
|
||||
})
|
||||
}
|
||||
|
||||
func (bot *Bot[T]) emitSceneError(ctx *SceneContext, scene *Scene[T], kind HandlerEventKind, name string, err error) {
|
||||
type reportedSceneError struct {
|
||||
err error
|
||||
}
|
||||
|
||||
func (e *reportedSceneError) Error() string { return e.err.Error() }
|
||||
func (e *reportedSceneError) Unwrap() error { return e.err }
|
||||
|
||||
func (bot *Bot[T]) emitSceneError(ctx *SceneContext, scene *Scene[T], kind HandlerEventKind, name string, err error) error {
|
||||
bot.safeEmitEvent(ctx.Context(), ErrorEvent{
|
||||
UpdateID: ctx.Update.UpdateID,
|
||||
UpdateType: ctx.Update.Type,
|
||||
@@ -211,6 +214,7 @@ func (bot *Bot[T]) emitSceneError(ctx *SceneContext, scene *Scene[T], kind Handl
|
||||
Err: err,
|
||||
UserFacing: IsUserError(err),
|
||||
})
|
||||
return &reportedSceneError{err: err}
|
||||
}
|
||||
|
||||
func (bot *Bot[T]) emitSceneTransition(ctx *SceneContext, scene *Scene[T], from string, result SceneResult) {
|
||||
@@ -266,7 +270,7 @@ func (bot *Bot[T]) applySceneResult(scene *Scene[T], ctx *SceneContext, result S
|
||||
case SceneActionPass:
|
||||
return false, nil
|
||||
default:
|
||||
return false, nil
|
||||
return false, fmt.Errorf("%w: %v", ErrInvalidSceneAction, result.Action)
|
||||
}
|
||||
}
|
||||
func buildSceneKey(scope SceneScope, ctx *MessageContext) (string, bool) {
|
||||
|
||||
Reference in New Issue
Block a user