Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
beproudbot slack移行
Search
altnight
April 20, 2015
Technology
0
860
beproudbot slack移行
connpass.com/event/12689/
altnight
April 20, 2015
Tweet
Share
Other Decks in Technology
See All in Technology
5分で紹介する生成AIエージェントとAmazon Bedrock Agents / 5-minutes introduction to generative AI agents and Amazon Bedrock Agents
hideakiaoyagi
0
220
PL900試験から学ぶ Power Platform 基礎知識講座
kumikeyy
0
110
飲食店予約台帳を支えるインタラクティブ UI 設計と実装
siropaca
6
1.4k
APIファーストで実現する運用性の高い IoT プラットフォーム: SORACOMのアプローチ
soracom
PRO
0
240
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
Building Products in the LLM Era
ymatsuwitter
10
4.4k
Data-centric AI入門第6章:Data-centric AIの実践例
x_ttyszk
1
370
家電アプリ共通PF "Linova" のAPI利用とPostman活用事例ご紹介
yukiogawa
0
130
Larkご案内資料
customercloud
PRO
0
600
管理者しか知らないOutlookの裏側のAIを覗く#AzureTravelers
hirotomotaguchi
2
240
リーダブルテストコード 〜メンテナンスしやすい テストコードを作成する方法を考える〜 #DevSumi #DevSumiB / Readable test code
nihonbuson
11
5.8k
SA Night #2 FinatextのSA思想/SA Night #2 Finatext session
satoshiimai
1
100
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
132
33k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
232
17k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Embracing the Ebb and Flow
colly
84
4.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
175
51k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Typedesign – Prime Four
hannesfritz
40
2.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
Transcript
beproudbot Slack移行 天下一bot武闘会 2015/04/17
目次 - はじめに - お前誰よ - 技術的なこと - 実装コード例 -
まとめ
お前誰よ - altnight - Python/Django - bot担当
Skypeつらい - 重い - 重い - 重い - 同期できないときがある -
落ちる - 固まる - 通知できない… - なんとなくイケてない…
Slackにしよう - Slackにすれば - 軽くて - 通知もできて - スニペットもはれて -
Integrationも便利で - なんかいろいろいい感じで最高では?
Slackに移行するには? - アカウントを調べて - 料金や制限を調べて - 必要な人を招待して - 部屋の命名規則などを決めて -
beproudbotを動くようにする <- ここの作業
概要 - Skypeで動作するbeproudbotをSlackでも動かす - 開発期間は1ヶ月弱(2014/07)
beproudbotの歴史 - 1枚のスクリプトだった - djangoアプリ化された - いろいろ機能が増えた - GJ機能を実装していた流れでSlack対応の実装をした
What is GJ機能 - 「GJ」なことがあったらインクリメント - デクリメントはなし - “altnight++ bot実装”
みたいにチャット上でカジュアルに行 う
What is GJ機能
What is GJ機能 - 雑談でも?
フレームワーク/ライブラリ - Python 2.7(将来Py3移行できるように) - Django 1.5(当時の最新版) - irc -
slacker
設計 - Djangoアプリで作成する - botの発言イベントの受け取りはircライブラリで行う - 受け取ったイベントメッセージのハンドラーを作る - Skype4Pyで動く既存実装を流用するため、Skype4Pyイベン トと互換性のあるオブジェクトを実装する
- 投稿はSlack APIを使用する
構成
構成
イベントの取得をどうする? - outgoingを経由しているプラグインは、プライベートグループ が多いので事実上使えない - -> hubotも使えない(かった) - 自前でポーリング実装する? -
Slack API access limit にひっかかるのでは?
イベントの取得をどうする? - SlackのIRC gateway接続でIRC接続部分を流用するのが一 番楽だった - 現在は RTM API あります
- https://api.slack.com/rtm
起動する beproudbot/beproudbot/ircbot/management/commands/runircbot.py logger.info('ircbot start command accepted') # connect to irc
client ssl_factory = irc.connection.Factory(wrapper=ssl.wrap_socket) connection_data = dict(connect_factory=ssl_factory) bot = IRCBot(settings.IRC_CHANNEL, settings.IRC_NICK, settings.IRC_SERVER, settings.IRC_PORT, settings.IRC_PASSWORD, **connection_data) # slack インスタンスをbotに紐付ける slack = slack_utils.get_slack(settings.SLACK_API_TOKEN) setattr(bot, '_slack_instance', slack) # 部屋名一覧をbotに紐付ける room_list = slack_utils.get_rooms(slack) setattr(bot, '_room_list', room_list) # ユーザー一覧をbotに紐付ける user_list = slack_utils.get_users(slack) setattr(bot, '_user_list', user_list) # bot.start の後に埋め込むとログが出ないため手前でロギングする logger.info('ircbot start successfully') # start try: bot.start() except Exception, e: logger.exception('ircbot exception') raise
Botインスタンスの作成 beproudbot/beproudbot/ircbot/bot.py class IRCBot(irc.bot.SingleServerIRCBot): def __init__(self, channel, nickname, server, port=6667,
password='', **connection_data): irc.bot.SingleServerIRCBot.__init__(self, [(server, port, password)], nickname, nickname, reconnection_interval=60, **connection_data) def make_message_event(self, event): """ IRCで送られてくるイベントからアプリで使う Messageイベントに変換する """ return Message(self, event.sender_unicode, event.body_unicode, event.target_unicode) def process_on_pubmsg(self, event): """ グループの発言を受け取って処理する """ msg = self.make_message_event(event) on_irc_message.dispatch(msg) def on_pubmsg(self, connection, event): """ チャンネル、グループメッセージが送られてきたときのフックポイント """ self.process_on_pubmsg(event)
ありがちなこと - アッ
Skype4Py互換オブジェクト作成 beproudbot/beproudbot/ircbot/handlers.py class Chat(object): def __init__(self, irc_instance, target): self._irc_instance =
irc_instance # 部屋ID self.Name = slack_utils.get_channel_id(target, self._room_list) # 部屋名 self.Topic = target def SendMessage(self, msg): post_message(self._slack_instance, self._target_name, msg, self._irc_instance)
Skype4Py互換オブジェクト作成 class Message(object): def __init__(self, irc_instance, who, body, target): self.Sender
= Sender(who) self.Body = body self.Chat = Chat(irc_instance, target) self.Timestamp = time.time()
Skype4Py互換オブジェクト作成 class Sender(object): def __init__(self, who): self.Handle = who self.FullName
= who self.Birthday = ''
イベントの伝播 beproudbot/beproudbot/ircbot/handlers.py class IRCHandler(object): def __init__(self): self.receivers = set() def
connect(self, receiver): self.receivers.add(receiver) def dispatch(self, message): for receiver in self.receivers: receiver(self, message, "RECEIVED") on_irc_message = IRCHandler()
既存コードのレシーバ接続 beproudbot/beproudbot/thx/skypebot.py on_message.connect(thx_receiver) on_irc_message.connect(thx_receiver)
いくつか改修して - GJデータ移行 - 部屋モデル作成 - DB migration - コマンドのPrefix変更(#
-> $)
動いた - ほっ
まとめ - 全体的にうまく動いていて一安心 - Slackよい