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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
altnight
April 20, 2015
Technology
940
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
beproudbot slack移行
connpass.com/event/12689/
altnight
April 20, 2015
Other Decks in Technology
See All in Technology
AIエージェントが名古屋の猛暑からあなたを守る
happysamurai294
0
110
就職⽀援サービスにおけるキャリアアドバイザーのシフトスケジューリング
recruitengineers
PRO
1
140
FDE という解 ― 暗黙知と明示知をつなぐ、伴走型エンジニアリング ―
otanet
0
150
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
350
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.9k
エラーバジェットのアラートのタイミングを考える.pdf
kairim0
0
140
Chainlitで作るお手軽チャットUI
ynt0485
0
230
Kubernetesにおける学習基盤とLLMOpsの概要
ry
1
280
脆弱性対応、どこで線を引くか
rymiyamoto
1
380
フロンティアAIのゲート化と地政学リスク
nagatsu
0
130
RAG を使わないという選択肢
tatsutaka
1
220
自宅LLMの話
jacopen
1
520
Featured
See All Featured
Chasing Engaging Ingredients in Design
codingconduct
0
220
Ethics towards AI in product and experience design
skipperchong
2
310
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
22k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
540
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Being A Developer After 40
akosma
91
590k
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
290
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
Fireside Chat
paigeccino
42
3.9k
Become a Pro
speakerdeck
PRO
31
6k
Automating Front-end Workflow
addyosmani
1370
210k
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よい