鹿ビックリ作戦
さて、作戦はこうです。
畑の近くの木から、金だらいをロープで吊り下げます。そのロープはアピちゃんチームの作業小屋の近くまで張ります。作業小屋には新たなレバーを用意し、アピエッタちゃんがそのレバーを操作することでロープが切れます。そして、金だらいが落ち、その音で鹿を追い払うという寸法です。
「エイヤ、アンカーにロープを結びつけてください」
「はーい」
ですが、次の瞬間。
バゴーン! ゴンゴロゴンゴロ……
金だらいが、ぼんやりと立っていた近衛兵のヘルムに落下しました。金だらいは大音を響かせながら草むらを転がっていきます。
直撃を受けた近衛兵は、頭を抱えてその場にしゃがみ込みました。
「ごめんごめん、手が滑った」
エイヤがてへへと舌を見せます。
「お怪我はありませんか?」
わたくしは近衛兵に駆け寄ります。
「……はい! 頭を守ってくれた、こちらのヘルム! 傷一つ入っておりません! 今年度最後の特別価格、何と銀貨三枚九十八セント、銀貨三枚九十八セントでのご提供です。金利手数料は近衛長官が負担いたします。近衛兵の紋章もお付けして、お値段変わらず銀貨三枚九十八セント! 銀貨四枚を切っておりますよ! 今年度最後の特別価格。 今すぐお伝令を! 無料伝令♪ 0120~」
「……念のため診療所へお連れしてください」
「はっ」
「伝令オペレーターを増員してお待ちしておりま~す!! 」
近衛兵は同僚に連行されていきました。
「エイヤ、後で見舞いに参りましょう」
「……はい」
とにかく今は、作業を続行しましょう。
ロープを切断する装置として、鼠捕り用の小型のギロチンを使用します。予定外ですが、ロープ以外の物は切れないよう、端材で保護カバーを作って付けておきましょう。このままでは、けが人がさらに増ええしまいそうな気がします。
「これで完成です!」
「ぽふぃ!」
「はぁぴ!」
「はぴっ!」
では、わたくしのスキルの出番です。
「スキル〝C#〟日没後から夜明けまでの間に最初に動体検知した時にアピエッタちゃんお手」
我ながら長々しい名前ですね。
しかし、あの「動体検知しました」の連続では、アピエッタが疲弊してしまいます。そして、この仕掛けは、一度使ってしまえば修理するまで使えません。アピエッタが複数回レバーを押さえても、それは無駄な労力となってしまいます。
アピエッタの労力を考えれば、多少の複雑さはやむを得ません。
光る文字が宙に浮かびます。
``` csharp
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSwibo();
builder.Services.AddSkillDiscoveryMetadataGenerator();
var app = builder.Build();
app
.ExposeSkillDiscoveryMetadata("csharp.日没後から夜明けまでの間に最初に動体検知した時にアピエッタちゃんお手")
.WithSwiboEventHook("/");
var resetTime = DateTime.MinValue;
app.MapPost("/", async ([FromBody]SwiboEventNotification notification, ISwiboContext context, CancellationToken cancellationToken) =>
{
var now = DateTime.Now;
var sunsetHour = 18;
var sunriseHour = 6;
if(notification.EventType == SwiboEvent.ChangeReport &&
notification.TryParseContextData<SwiboCameraEventData>(out var data) &&
data.DetectionState == SwiboDetectionState.Detected &&
resetTime <= now &&
(now.Hour >= sunsetHour || now.Hour <= sunriseHour))
{
var アピエッタ = context.Swibos.OfType<SwiboBot>().First(x => x.Name == "アピエッタ");
await アピエッタ.PressAsync(cancellationToken);
if(now.Hour <= sunriseHour)
{
resetTime = now.Date.AddHours(sunsetHour);
}
else
{
resetTime = now.Date.AddDays(1).AddHours(sunsetHour);
}
}
return Results.Ok();
});
app.Run();
```
予想通り、なかなか複雑になりました。特にifの部分が。elseなどというものまで新登場しています。とはいえ、基本的な部分は変わりません。
``` csharp
await アピエッタ.PressAsync(cancellationToken);
```
PressAsync、つまり「お手」という命令のための条件やお膳立てが変わっているということなのです。
「では、夕方にアピィちゃんと、アピエッタちゃんは交代してください。アピエッタちゃんは、命令があったときにこのレバーを押してくださいね」
「ぽふぃぽふぃ」
「はぁぴ!」
「はぴっ」
さて、鹿を追い払うことはできるのでしょうか。




