20
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

研究室でHubot使ってる話

Last updated at Posted at 2014-12-12

うどん大学 情報系 院1年の堀内です.
Hubot×ChatOps勉強会 をやったりしています.

この記事は Hubot Advent Calendar 2014 の12日目です.
@bouzuya さんがHubotの解説を連載していて,基礎から勉強させてもらってます.

今回は,研究室のチャットルームに居る Huboco ちゃんの話をします.
(チャットは Typetalk を使っています.)

icon.png

ゼミ日程と発表者を通知

僕の所属する 最所研究室 では,週に1回,全員が集って進捗報告のゼミをしています.
後期からは,2人ずつプレゼン形式で報告するようになりました.(発表練習,資料作成のため.)

ラボメンから以下のような要望があったので,『ゼミ日程と発表者を通知』するscriptを作りました.
(今期のアニメを教えてくれるくらいしか能がなかったHubocoちゃんに仕事をしてもらうため.)

  • ゼミの日程変更を教えて欲しい.(前日に通知して欲しい.)
  • 3週に1回,発表担当になるが,忘れてしまう.

コマンド形式の semi.coffee と,cronで通知する semi_cron.coffee に分けています.
(思ったよりコードが肥大化したため.bouzuyaさんに怒られそう.)
ここでは,ゼミの日程や発表者をjson形式で保存しておき,それをHubotで読み込んで使ってます.

{
  "day": 3,
  "start_at": "14:40",
  "end_at": "16:10",
  "changes": [
    { "from": "2014/12/10(水)", "to": "2014/12/09(火) 10:30~12:00" }
  ],
  "presen": {
    "start_at": "2014/12/10",
    "rotate": 2,
    "users": [
      ["ぼうずや"],
      ["ひこにゃん"]
    ],
    "accounts": [
      ["@bouzuya"],
      ["@hiconyan"]
    ]
  }
}

実際に使うとこんな感じ.

semi.png

前日になると発表者を煽るリプライ飛ばして決ます.

semi_cron.png

卒論の締切を通知

つい先日4年生から,あるリクエストを受けた.

「卒論の締切まで何日か,毎日通知してくれる機能が欲しい」

せっかくなので修論の締切も教えてくれるように実装してみる.
cronと monent.js を使えば,簡単にできるかな.
hubot thesis bachelor 2015/02/10 で締切を設定,hubot thesis で何日か表示する.

# Description:
#   卒業論文・修士論文の締切を通知
#
# Commands:
#   hubot thesis - 締切までの日数を表示
#   hubot thesis bachelor <YYYY/MM/DD> - 卒論の締切を設定
#   hubot thesis master <YYYY/MM/DD> - 卒論の締切を設定
#
# Configuration:
#   HUBOT_THESIS_ROOMS: 締切を通知する部屋

cron = require('cron').CronJob
moment = require 'moment'
moment.locale 'ja'

module.exports = (robot) ->
  THESIS = ['bachelor', 'master']
  THESIS_JP = { bachelor: '卒論', master: '修論' }

  say = (room, message) ->
    envelope = room: room
    robot.send envelope, message

  dead_line = ->
    brain = robot.brain
    return false unless brain.data.thesis

    str = []
    today = moment()
    for key in THESIS
      date = brain.data.thesis[key]
      if date
        days = parseInt (moment(date, 'YYYY/MM/DD') - today) / 86400000
        str.push "#{THESIS_JP[key]}の締切まで #{days} 日"
    return str.join('、') + 'です'

  robot.respond /thesis$/i, (msg) ->
    str = dead_line()
    msg.reply str if str
    msg.reply '締切が設定されていません' unless str

  robot.respond /thesis\s+([a-z]+)\s+([0-9\/]+)$/i, (msg) ->
    key = msg.match[1]
    return unless key in THESIS
    date = msg.match[2]
    return unless date

    brain = robot.brain
    brain.data.thesis = {} unless brain.data.thesis
    brain.data.thesis[key] = date
    brain.save

    msg.reply "#{THESIS_JP[key]}の締切を #{date} に設定しました"

  new cron '0 0 10 * * *', ->
    rooms = process.env.HUBOT_THESIS_ROOMS
    return unless rooms
    str = dead_line()
    return unless str
    for room in rooms.split(',')
      say room, str
  , null, true, 'Asia/Tokyo'

実際に使うとこんな感じ.

huboco_thesis.png

まとめ

研究室で,ゼミや卒論の通知にHubotを使ってる話でした.

Hubot歴は4ヶ月くらいになるけど,CoffeeScriptを綺麗に書けない….
bouzuyaさんも言ってたけど,scriptはAPIを叩くとか,ミニマムな方が良いですね.

明日からはbouzuyaさんの連載が再開されます.
楽しみですね!

追記

THESIS = ['bachelor', 'master', 'doctor']
THESIS_JP = { bachelor: '卒論', master: '修論', doctor: '博論' }

このようにすると,博士論文にも対応できます.
B4,M2,D3のみなさん,論文執筆がんばってください!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?