Help us understand the problem. What is going on with this article?

研究室でHubot使ってる話

More than 5 years have passed since last update.

うどん大学 情報系 院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のみなさん,論文執筆がんばってください!

hiconyan
大手町でクラウドエンジニアしてます。うどん大学院 情報系出身。趣味は料理と映画、カメラ。
https://hiconyan.page/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした