VScodeをイかせました  ~ タイピングで絶頂する編集画面編 ~


## はじめに
久々のクソアプリアドベントカレンダー参加となります！
クソアプリアドベントカレンダー10周年おめでとうございます🎉🎉🎉

## ⚠️注意⚠️
この記事および拡張機能には、過激な表現が含まれます。
職場での閲覧・使用は絶対におすすめしません。

## 作ったもの
みなさんVScodeは使ってますでしょうか？
エンジニアの皆さんならVScodeの画面は親の顔より見てると言っても過言ではないのではないでしょうか。

ということで今回タイピングに応じて悶えるVScodeの拡張機能つくりました。

https://x.com/10sei0otto_/status/1868966613346926749

## どうやって作ったか

### 使った技術
- Rust（WebAssemblyにコンパイル）
- TypeScript（VS Code拡張部分）
- wasm-pack（RustのWasmビルド）


1. Rustで書いたコードをWasmにコンパイル
2. TypeScript/JavaScriptからWasmモジュールを呼び出し
3. VS Code APIを使って拡張機能として実装

### 実装の詳細

タイピング回数に応じて悶絶ワードを出すようにしました。
ワードは**Claude**が考えたので僕はなにも悪くないです！！


```rust
#[wasm_bindgen]
impl TypingOrgasm {
    #[wasm_bindgen(constructor)]
    pub fn new() -> Self {
        Self {
            type_count: 0,
            last_milestone: 0,
        }
    }

    // ここのメソッド名をmaybe_insultからincrement_and_checkに変更
    #[wasm_bindgen]
    pub fn increment_and_check(&mut self) -> Option<String> {
        self.type_count += 1;

        // 特別なマイルストーン
        match self.type_count {
            count if count == 50 => Some("あっ...なんか来る...".to_string()),
            count if count == 80 => Some("ちょっと...やばいかも...♡".to_string()),
            count if count == 100 => Some("あぁん...きちゃう...！".to_string()),
            count if count == 150 => Some("もっと...もっとぉ...！".to_string()),
            count if count == 180 => Some("あっ...だめ...とまらないぃ...！".to_string()),
            count if count == 200 => Some("あぁん...もうダメ...！".to_string()),
            count if count == 250 => Some("んッ...！あッ...！イクぅ...！".to_string()),
            count if count == 280 => Some("イっちゃう...イっちゃうよぉ...！".to_string()),
            count if count == 300 => Some("イクっ！イクイクイクぅっ！".to_string()),
            count if count == 350 => Some("もうだめぇ...！止まらないのぉ...！".to_string()),
            count if count == 380 => Some("あぁっ...！また...また来るぅ...！".to_string()),
            count if count == 400 => Some("WHITE_SCREEN".to_string()),
            _ => {
                if self.type_count >= 400 {
                    if self.type_count % 20 == 0 {
                        // 400回以降は余韻
                        let phrases = vec![
                            "はぁ...はぁ...♡",
                            "ふにゃぁ...♡",
                            "まだ...びくびくしてる...♡",
                            "あぅ...余韻やばい...♡",
                            "も...もう無理ぃ...♡",
                        ];
                        Some(phrases[self.type_count as usize / 20 % phrases.len()].to_string())
                    } else {
                        None
                    }
                } else if self.type_count % 20 == 0 {
                    // 通常時の20回ごとの反応
                    let phrases = vec![
                        "んっ...♡",
                        "あぁ...♡",
                        "はぁん...♡",
                        "きもちぃ...♡",
                        "もっとぉ...♡",
                    ];
                    Some(phrases[self.type_count as usize / 20 % phrases.len()].to_string())
                } else {
                    None
                }
            }
        }
    }

    #[wasm_bindgen]
    pub fn get_count(&self) -> u32 {
        self.type_count
    }
}

```

よかったら試してみてね！

https://github.com/gumipo/vscode-orgasm

## 工夫した点
タイピングの回数をカウントしてカウントに応じた悶絶ワードを出すようにしました

![スクリーンショット 2024-12-17 19.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669792/0b5b8eaf-9976-4013-dc04-7b7d06a193b0.png)

絶頂のタイミングで編集画面が真っ白になります

![スクリーンショット 2024-12-17 10.21.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669792/3cfdf714-a17a-9254-6e52-5f2bb51ce773.png)

絶頂後は絶頂後のワードを出すようしてます！

## なぜ Rust + Wasm?
特に意味はないです！
最近学習していて使いたかったのでRustちょっと使ってみることにしました！

でも作った後にRustにしてよかったなぁと思いました。
なぜなら

#### エディタを悶えさせるという重要な処理には、高速で安全な言語が必要だからです（？）

## 今後の展望
- 海外版対応
- タイピングの速度に応じた反応の追加

## 余談
Claudeにワードを考えさせたら最初、海外版を提案されて笑いましたw

![スクリーンショット 2024-12-17 19.59.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/669792/0b797398-2ad9-1f15-dfdb-e42b8177ba7c.png)

あと実はもう一個作りました。
ワードをプレスして壊すワードプレスってアプリです。
VScodeの賢者中はこっちでも遊んでみてください
https://word-press-press.vercel.app/

## まとめ
下ネタMAXですみません！！
ずっと参加できてなかったですがクソアプリ制作はやっぱり楽しいですね。
来年も参加します！！最後までご覧くださりありがとうございました！！

## 過去作
https://qiita.com/10sei0otto/items/9aea8cbdbe9de85b1eeb