見出し画像

[Misskey] カスタム絵文字ブラックリストプラグインを作りました

箱詰九分です。そんな感じでやっている。
Misskey 用のプラグインを作りました。

カスタム絵文字ブラックリストプラグイン

/// @ 0.18.0
### {
  name: "カスタム絵文字ブラックリスト"
  version: "0.0.0"
  author: "9min_packup"
  description: "ブラックリストにマッチした絵文字を消します"
  permissions: [] 
  config: {}
}

// ブラックリスト(ここに絵文字名を書く)
let emoji_blacklist = [
	'parrot',
	'ponpe',
	'partyparrot',
	'soukamo',
	'ohayou',
]

// ノートを取得したときに実行される関数
Plugin:register_note_view_interruptor(@(note) {
	// テキスト内の絵文字を消す
	let s = note.text.split(':')
	for let i, s.len {
		if emoji_blacklist.incl(s[i]) {
			s[i] = ""
		}
	}
	note.text = s.join(':')

	// リアクションを消す
  let keys = Obj:keys(note.reactions)
  var rs = {}
	for let i, keys.len {
		var name = keys[i]
		if name.len >= 2 {
			let index = keys[i].index_of('@')
			name = keys[i].slice(1, index)
		}
		if emoji_blacklist.incl(name) {
			
		} else {
			let val = Obj:get(note.reactions, keys[i])
			Obj:set(rs, keys[i], val)
		}
  } 
  
  note.reactions = rs
  
  note
})

emoji_blacklist っていう配列に消したい絵文字の名前を指定してください。テキスト中のものは :: に変換されて、リアクションからは消えます。リアクションはロードの一瞬見えるのが難点ですが...ずっと見えるよりはましかも。リモートの絵文字も同名であれば消えます。

プラグインの導入は「設定→プラグイン→プラグインのインストール」で。

ブラックリストを修正する場合はプラグインを再インストールしなければいけないのは少し面倒かも…これはどうしようもなくて、ごめんなさい。

副産物

リアクションを全て❤️に置換するプラグインです。文章中のものは置換されません。まるで別の SNS のようだ…

/// @ 0.18.0
### {
  name: "リアクションを全部❤️に置換する"
  version: "0.0.0"
  author: "9min_packup"
  description: "自分で押したリアクションだけ表示されます"
  permissions: [] 
  config: {}
}

Plugin:register_note_view_interruptor(@(note) {
  let keys = Obj:keys(note.reactions)
  var sum = 0
	for let i, keys.len {
		sum += Obj:get(note.reactions, keys[i])
  } 
	if sum > 0 {
		var obj = {}
		Obj:set(obj, '❤️', sum)
	 	note.reactions = obj
	}

  note
})

リアクション数の合計は❤️の数として表示されます。リアクションの総数がわかるのはいいのかも。いや…そうでもないか。

なぜこんなことをするのですか

需要はあると思う。

チカチカする絵文字やセンシティブな絵文字を苦手とする人はいると思ってて。住み分けできたらいいなって。そう思った。役立ててほしいです。

仕組み

Plugin:register_note_view_interruptor という関数はノートを取得したときに実行される関数です。ここで取得したノートを加工しています。本文中のものは文字列の置換で、リアクションはオブジェクトの差し替えで対応しています。

関数が受け取っている note というオブジェクトはそのまま javascript のオブジェクトのようです。中身はこのようになっています。

{
  id: '9so7v7s5gapc008e',
  createdAt: '2024-04-29T07:43:04.229Z',
  userId: '9sh1smzobb9l0001',
  user: {
    id: '9sh1smzobb9l0001',
    name: '箱詰九分test',
    username: '9min_packup',
    host: null,
    avatarUrl: 'http://192.168.1.24/proxy/avatar.webp?url=http%3A%2F%2F192.168.1.24%2Ffiles%2F2d5355e3-7644-4b19-b339-3d95c059da35&avatar=1',
    avatarBlurhash: 'eMH.NY00X8?b_3-,RoIX-;D*WaD%~pa%M{RjR+ofoct7?bWAIU%MjY',
    avatarDecorations: [],
    isBot: false,
    isCat: false,
    emojis: {},
    onlineStatus: 'online',
    badgeRoles: [],
  },
  text: 'テスト投稿',
  cw: null,
  visibility: 'public',
  localOnly: false,
  reactionAcceptance: 'nonSensitiveOnly',
  renoteCount: 0,
  repliesCount: 0,
  reactions: {
    ':moina_swim_fast@.:': 1,
  },
  reactionEmojis: {},
  fileIds: [],
  files: [],
  replyId: null,
  renoteId: null,
  clippedCount: 0,
  myReaction: ':moina_swim_fast@.:',
}

このプラグインの場合、 note.text と note.reactions を加工しています。

ちなみに、返り値に note を指定しなかった場合は非表示(ミュート)になるらしくて。特定のユーザーをミュートしたり、特定のユーザーのファイル投稿以外をミュートしたり…ということができるようです。SNS ってなんなんだろう。

プラグイン制作については公式のドキュメントを読むことをおすすめします。


終わりに

短くなりましたが、今回はこのへんで。よき Misskey ライフを。

この記事が気に入ったらサポートをしてみませんか?