LoginSignup
1
3

More than 5 years have passed since last update.

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

Posted at

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
from slackbot.bot import listen_to
import re

pastmsg = ''
pastmsg2 = ''

@listen_to(r'.+')
def savemsg(message):
    global pastmsg2
    global pastmsg
    pastmsg2 = pastmsg
    pastmsg = message.body['text']

@listen_to(r'^s/+\S+/+\S+/$')
def replace(message):
    before = re.findall(r'^s/(.*)/+\S+/', pastmsg)
    after = re.findall(r'^s/+\S+/(.*)/', pastmsg)
    if before[0] in pastmsg2:
        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つずつしか無いんだからリストじゃなくて良いけどマッチした文字列の取得方法が分からんかった
1
3
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
1
3