Quantcast
Channel: Vimタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 5608

Vim風の置換コマンドをSlackbotに実装してみた #Python

$
0
0

Vimって良いよね!

みなさん, Vim使ってますか?
Vim使ってますよね?
Vim使ってないわけ無いですよね?
僕は使ってます.

ではVimmerの皆さん, Vimの日本コミュニティは知っていますか?
Vimの日本コミュニティは主にLingr上で活動しています.
で, ここのチャット部屋なんですが結構な数のbotが動いてて, すごく便利な機能がたくさんあります.
そんな中で, 僕が1番良いなと思った機能がこちらです.
Screen Shot 2017-05-21 at 10.04.22.png
これ, 凄くないですか?
Vimの置換コマンドを打ったらbotがすかさず修正版の文章を送ってくれるんです.
(全てのプログラマーはVimmerであるという前提の下で進めるため, Vimの置換コマンドについては説明しません. だってみんなVimmerでしょ?)

僕は前から常々思っていました.
「これ, 自分とこのSlackにパクりてぇ」
でもSlackbotは過去に諦めた経験があったので敬遠していたのですが,
「もしかしたら今ならできるんじゃね?」
と思い至ってしまいました.

ってな訳で作り方行きまーす.

ソースはこ↑こ↓に置いときますね.

尚, 参考にさせて頂いたサイトは以下の通りです.

作り方

準備

今回はこちらの記事を参考にさせて頂きました.
まずはパパっとこの辺まで準備しちゃって下さい.
ここまで終わったら今回の置換コマンドを作っていきたいと思います.

置換コマンド

まずpluginディレクトリの中にbot_listen.pyというファイルを作って下さい.

中身はこうします.

bot_listen.py
fromslackbot.botimportlisten_toimportrepastmsg=''pastmsg2=''@listen_to(r'.+')defsavemsg(message):globalpastmsg2globalpastmsgpastmsg2=pastmsgpastmsg=message.body['text']@listen_to(r'^s/+\S+/+\S+/$')defreplace(message):before=re.findall(r'^s/(.*)/+\S+/',pastmsg)after=re.findall(r'^s/+\S+/(.*)/',pastmsg)ifbefore[0]inpastmsg2:message.send('「'+pastmsg2.replace(before[0],after[0])+'」って言いたかったんだね')else:message.send('前の文章に「'+before[0]+'」は入って無いよ?')

やってることとしては,

  • pastmsgpastmsg2に直近2つのメッセージを保存しておく
  • s/なんか1/なんか2/という形の発言があれば処理を行う
  • beforeなんか1の文字列のリスト, afterなんか2のリストを代入
  • 2個前のメッセージの中になんか1があれば, なんか1なんか2に置換して, 結果をbotちゃんが教えてくれる
  • マッチしなければ, botちゃんに馬鹿にされる

正規表現さえ使えれば大したことは無いですね.

課題

  • 直近2つのメッセージの保存が汚い
    • 標準機能で取得方法がありそう
  • 置換コマンドの直前の文章にしか反応しないから, 自分が発言して誤字に気付いた後で他のユーザーが先に発言をしてしまうと置換が効かなくなる
    • 連想配列あたりで個↑々↓のユーザー毎に直近2つを保存しておけば良いかも
    • ってか標準機能で取得h(ry
  • どうせbeforeafter1つずつしか無いんだからリストじゃなくて良いけどマッチした文字列の取得方法が分からんかった

Viewing all articles
Browse latest Browse all 5608

Trending Articles