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
890
beproudbot slack移行
connpass.com/event/12689/
altnight
April 20, 2015
Tweet
Share
Other Decks in Technology
See All in Technology
OpenTelemetry が拡げる Gemini CLI の可観測性
phaya72
2
2.2k
ヘンリー会社紹介資料(エンジニア向け) / company deck for engineer
henryofficial
0
350
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
5
43k
CREが作る自己解決サイクルSlackワークフローに組み込んだAIによる社内ヘルプデスク改革 #cre_meetup
bengo4com
0
320
だいたい分かった気になる 『SREの知識地図』 / introduction-to-sre-knowledge-map-book
katsuhisa91
PRO
3
1.4k
serverless team topology
_kensh
3
210
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.8k
AI時代の開発を加速する組織づくり - ブログでは書けなかったリアル
hiro8ma
1
300
Observability — Extending Into Incident Response
nari_ex
1
150
Copilot Studio ハンズオン - 生成オーケストレーションモード
tomoyasasakimskk
0
220
AWS DMS で SQL Server を移行してみた/aws-dms-sql-server-migration
emiki
0
200
【SORACOM UG Explorer 2025】さらなる10年へ ~ SORACOM MVC 発表
soracom
PRO
0
110
Featured
See All Featured
Practical Orchestrator
shlominoach
190
11k
Testing 201, or: Great Expectations
jmmastey
45
7.7k
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Writing Fast Ruby
sferik
630
62k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.2k
Leading Effective Engineering Teams in the AI Era
addyosmani
7
600
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
253
22k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
YesSQL, Process and Tooling at Scale
rocio
173
15k
Building an army of robots
kneath
305
46k
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よい