起きていられない

SECCON Beginners CTF 2021の開催時間は24時間です.

エナドリを買い込んでいたので24時間連続で起きる事も不可能ではない気がしていたんですが,13:30からライブを行う事,翌日には朝からラボユースの活動がある事を考慮し,仮眠を取ることにしました.

過去の失敗

私は,過去にサークルで主催したCTFにおいて,開催期間が12時間と短かったにも関わらず,その半分近くを寝て過ごしてしまうという大罪を犯しました.

何度もDiscord等で連絡が来ていたにも関わらず,起きることができなかった経験から,なんとか改善しなくてはいけないと思い,22日深夜,寝る前に簡単なプログラムを作成しました.

serenity

Rustには,SerenityというDiscord用のライブラリがあります.

また,私の部屋にはアンプとヘッドホンがあります.

これらを用いて,Discord botを通じて,私の頭に装着されたヘッドホンから爆音で音楽を再生するプログラムを作成しました.

これで何かあった際にはこのbotを使えばn01e0を起こす事ができます.

src

use once_cell::sync::Lazy;
use serenity::{
    async_trait,
    model::{channel::Message, gateway::Ready},
    prelude::*,
};
use std::env;
use std::process::Command;

static DISCORD_TOKEN: Lazy<String> =
    Lazy::new(|| env::var("DISCORD_TOKEN").expect("expected a discord token"));

struct Handler;

#[async_trait]
impl EventHandler for Handler {
    async fn message(&self, ctx: Context, msg: Message) {
        if msg.content == "!wakeup" {
            if let Err(why) = Command::new("aplay")
                .arg(env::var("ALARM_MUSIC").unwrap_or(String::from(
                    "/home/lilium/Music/the pillows - FooL on CooL generation/LITTLE BUSTERS.wav"
                )))
                .spawn()
            {
                eprintln!("spawn error by {:?}", why);
                msg.channel_id
                    .say(&ctx.http, "Sorry Bot broken please call to XXX-XXXX-XXXX")
                    .await
                    .unwrap();
            }
        }
    }

    async fn ready(&self, _: Context, ready: Ready) {
        println!("{} is connected!", ready.user.name);
    }
}

#[tokio::main]
async fn main() {
    let mut client = Client::builder(&*DISCORD_TOKEN)
        .event_handler(Handler)
        .await
        .expect("err creating client");

    if let Err(why) = client.start().await {
        println!("Client error: {:?}", why);
    }
}

結果

結局,開催期間中に障害が発生することは無く,気持ちよく朝を迎える事ができました.

それもこれもLifeMemoryTeamのおかげです.

ありがとうLifeMemoryTeam

why

なぜRustでやったかと言うと,スクリプト言語で書けばいいこともRustで書くくらいにはRustが好きだからです.