LoginSignup
0
0

More than 5 years have passed since last update.

(今更)python向けIRCクライアント作成した(ら並行処理をちょっと使えるようになった)

Posted at

参考リンク

https://www.codereading.com/codereading/python/python-irc-client.html
http://qiita.com/mmttt202/items/d182c6f27f466c923fea
上記の内容を参考にさせて頂きました。

背景

現在の環境(職場)では(メール以外の)主なコミュニケーションツールがIRCとなっている。
IRCでのやり取りの頻度が高い環境になっています。

リポジトリ

使い方

ローカルに上記のリポジトリからcloneするか、downloadしてコピーする等をしておきます。
また、PyYAMLが必要です。実行環境にPyYAMLが存在しない場合は以下でインストールしてください。

pip -r requirements.txt
#もしくは
pip install PyYAML

クライアント生成時に各種パラメータを与える場合

クライアント生成時に各種パラメータを引数に生成します。

import simple_irc_client
client = simple_irc_client.simple_irc_client('servername', port, 'nickname', 'username', 'channel', 'realname', 'hostname')

yamlに各種パラメータを記載しておく場合

付属しているyamlを使用する場合は、以下の通り、コンフィグの読み込みを実施します。

import simple_irc_client
client = simple_irc_client.simple_irc_client()
client.config_from_yaml('config.yaml')

サーバへ接続してチェンネルにJOINする

以下を実施すると、サーバへ接続し、チャンネルに入り、
PINGに対する応答は自動で実施されます。

client.start()

チャンネルで発言する

sayメソッドを使用して発言(PRVMSG)をします。

client.say('発言')

noticeで通知する

noticeメソッドを使用して通知(NOTICE)をします。

client.notice('通知')

定期的に発言するスクリプトを定義する

定期的に発言する何某かを定義して以下の様に、threadingで実行するというのは如何でしょうか?

def time_notice():#XX時00分になったら時間をお知らせする
    while True:
        time.sleep(60)
        if datetime.datetime.now().minute == 0:
            client.say(str(datetime.datetime.now().hour) + '時になりました')

timenotice = threading.Thread(target=time_notice)

動作環境

python3.6
私は本クライアントをLinux(CentOS6.8)上で動作させているので、
nohup ./スクリプト名 &
で実行しています。
macでも同様に実行出来るようと思いますが、動作確認していません。
もっと良い方法があるかもしれませんが、一応↑で要件満たしました。

動機と実現したかったこと

決まった時間にとある作業を実施するような業務が存在しているが、忘れてしまうことが多々ありました。
なぜなら、忘れても直接クリティカルな影響が無い業務なので「ついつい忘れちゃう」、ということが多発していました。(要するに退屈な業務でした・・・)

「忘れてしまう」ということが無くなるように注意喚起するべく、普段よく見ているIRCで決まった時間になったら
「XXしてください」
という様な感じで通知してくれるツールがあれば「ついつい忘れちゃう問題」が無くなるのではないか、と推察しました。
そこで、sopelというIRCクライアントを同僚に教えて貰ったが、動作が非常に不安定な(実行する際に他のファイルの読み込みがされたりされなかったり謎の挙動があった)ので、勉強のつもりで作ってしまえ、と思い、クライアントを作成しました。
「PINGに対してPONGを返しながら、一定時間(time.sleep(秒数))ごとに何かしらの処理を何個か実装する」という点が始めてだったので、その点が特に理解が必要な点でした。

注意事項

  • 日本語に対応させているので、「iso2022_jp」のみで発言します。(encodingを変更出来るようにした方が良いのか・・・?)

  • パラメータを定義後、クライアントを起動する際は、
    start()
    と実行すればPINGに対する応答も別スレッドで自動で実行されます。
    なので、定時実行すべきものを別途作成し、
    sayメソッドを使用して発言するような内容を記述すればOKです。

  • 本クライアントのみでは投稿された内容の判別機能が無いので、このままではbot的な使用方法ができません。 メソッドをオーバーライドして発言内容を取得する様に実装するなどしてください。

IRCの基本的なお作法は、本クライアントに任せることが出来るので、
あとは定時実行する内容に注力することが可能、ということ感じです。

得たこと

    def start(self):
        if not self.server or not self.nickname or not self.channel\
          or not self.realname or not self.hostname:
            print('error!!')
            print('invalid parameter(s). check server or nickname or channel or realname or hostname')
        else:
            thread = threading.Thread(target=self._wait_message)
            self._irc_conn()
            self._login()
            self._join()
            thread.start()

threadモジュールにより、並行処理についての知見を得ることが出来た。
もっと理解が難しいものかと思っていたが、参考リンクの内容を見て、
ひとまず使うだけであれば以外と簡単に実装することが出来た。
※PINGを応答しながらカウントして定時に発言するということが出来るようになった。

ただし、並行処理について内容の理解は薄いですし他の応用についてもまだまだだと思うので引き続き学習が必要と感じてます。

その他

その他、有志による実装、またはアドバイス、ISSUEを頂けると大変嬉しいです。

0
0
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
0
0