LoginSignup
8
1

More than 1 year has passed since last update.

圧倒的な異臭を放つDiscord Botを作ってみた ~Qusineを添えて~

Last updated at Posted at 2022-12-09

この記事はクソアプリ Advent Calender 9日目(シリーズ3)の記事です。

圧倒的な異臭を放つDiscord Botを作ってみました!!!!!!!!!

リポジトリ:sevenc-nanashi/pooper

Qusineって?

Qusine(クサイン)とは、Quineのうち、特に異臭がするものを指す。
出典:なし

仕組み

ライブラリ

今回は自作のDiscord APIラッパー、discorbを使いました。
DBはsqlite、操作にはsequelを使っています。

置き換え部分

client.on :message do |message|
  next if message.author.bot?
  next unless channels.include?(message.channel.id.to_s)
  next unless message.channel.is_a?(Discorb::TextChannel)
  channel = message.channel
  (
    channel.fetch_webhooks.wait.find { |w| w.name == "Pooper" } ||
      channel.create_webhook("Pooper").wait
  ).post(
    message.content.gsub(
      /[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]|<a?:[a-z0-9_]+:[0-9]+>/i,
      "💩"
    ),
    username: message.author.name,
    avatar_url: message.author.avatar.url,
    allowed_mentions:
      Discorb::AllowedMentions.new(
        everyone: false,
        roles: false,
        users: false
      )
  )
  message.delete
end
  1. Pooperという名前のWebhookを取得(無かったら作成)、
  2. /[\p{Emoji}\p{Emoji_Component}&&[:^ascii:]]|<a?:[a-z0-9_]+:[0-9]+>/iで置き換え(参考:Rubyで文字列に絵文字が含まれるかどうかを判定する方法(ruby-jp slackで2021/11/08に行った質問回答まとめ)
  3. 投稿者と同じ名前・アイコンで置き換え後の内容を投稿、
  4. 元メッセージを削除

といった感じになっています。

Qusine部分

client.slash(
  "qusine",
  "このBotのソースコードを表示します。"
) do |interaction|
  interaction.post(
    attachment:
      Discorb::Attachment.from_string(
        " " * 51 + "eval(\n" + " " * 49 + "(s='" + s +
          "').gsub(/\\s/,''))",
        "pooper.rb"
      )
  )
end

最初のeval((s='、最後の').gsub(/\s/,''))の部分以外はsを書いているだけです。単純。

で、これ実用性あるの?

ない(断言)

けどこれを作ってるときにWebhookクラスのバグを見つけられたのでOKです。

あとがき

圧倒的・異臭。Quineは2作目ですが、結構いい作品が作れたと思います。(1作目:Bad Quine!
最後まで読んんで下さりありがとうございました。

宣伝

discorbというRubyのDiscord APIラッパーを作っています。バグ報告やPRしてくださると嬉しいです。

8
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
1