From dfd1b47fd5159d4d93a0aafa918419ff5c547dcd Mon Sep 17 00:00:00 2001 From: Takuya Okada Date: Thu, 8 Oct 2015 18:15:21 +0900 Subject: [PATCH] Add cleaner reporter To use this function, write the following setting to ~/.config/nomrat/cleaner.yml --- token: "hoge-0123456789-0123456789-0123456789-a1aa11" channel: "sandbox" --- bin/nomnichi_bot | 2 +- lib/nomrat/reporter.rb | 5 +-- lib/nomrat/reporter/cleaner.rb | 27 ++++++++++++++++ lib/nomrat/scrap.rb | 4 ++- lib/nomrat/scrap/cleaner.rb | 56 ++++++++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 4 deletions(-) create mode 100644 lib/nomrat/reporter/cleaner.rb create mode 100644 lib/nomrat/scrap/cleaner.rb diff --git a/bin/nomnichi_bot b/bin/nomnichi_bot index 89d47e2..2c53774 100755 --- a/bin/nomnichi_bot +++ b/bin/nomnichi_bot @@ -58,7 +58,7 @@ if str = ARGV.shift sender.send_message(str, $NOMRAT_CHANNEL) end else - subjects = [:nomnichi, :tvshow, :weather, :security_advisory, :calendar] + subjects = [:nomnichi, :tvshow, :weather, :security_advisory, :calendar, :cleaner] subjects.each do |subject| print "* #{subject}:\n" if $NOMRAT_TEST || $NOMRAT_DEBUG diff --git a/lib/nomrat/reporter.rb b/lib/nomrat/reporter.rb index 80c377f..6d45ae0 100644 --- a/lib/nomrat/reporter.rb +++ b/lib/nomrat/reporter.rb @@ -7,7 +7,8 @@ def self.report(subject) :nomnichi => Nomnichi, :security_advisory => SecurityAdvisory, :tvshow => Tvshow, - :weather => Weather + :weather => Weather, + :cleaner => Cleaner, } return reporters[subject].new.report if reporters[subject] raise ArgumentError, "unknown subject #{subject}" @@ -19,6 +20,6 @@ def self.report(subject) autoload :SecurityAdvisory, "#{dir}/security_advisory.rb" autoload :Tvshow, "#{dir}/tvshow.rb" autoload :Weather, "#{dir}/weather.rb" - + autoload :Cleaner, "#{dir}/cleaner.rb" end # module Reporter end # module Nomrat diff --git a/lib/nomrat/reporter/cleaner.rb b/lib/nomrat/reporter/cleaner.rb new file mode 100644 index 0000000..1676a7f --- /dev/null +++ b/lib/nomrat/reporter/cleaner.rb @@ -0,0 +1,27 @@ +module Nomrat + module Reporter + class Cleaner + CLEAN_WDAY = 1 # Monday + + def report + return nil unless Date.today.wday == CLEAN_WDAY + before_cleaner = Nomrat::Scrap.open(:cleaner).last.cleaner + return "今週の掃除当番は #{next_cleaner(before_cleaner)} です.掃除後に報告をお願いします." + end + + private + + def cleaners + return %w( + okada kitagaki masuda-y + ikeda-y ichikawa kobayashi nakamura fujita + emi suetake sugi date yoshida-h + ) + end + + def next_cleaner(before_cleaner) + cleaners[cleaners.index(before_cleaner) + 1] + end + end # class Cleaner + end # module Reporter +end # module Nomrat diff --git a/lib/nomrat/scrap.rb b/lib/nomrat/scrap.rb index 4215dfa..8f95964 100644 --- a/lib/nomrat/scrap.rb +++ b/lib/nomrat/scrap.rb @@ -10,7 +10,8 @@ def self.open(scrap_name) :debian_security_advisory => DebianSecurityAdvisory, :nomnichi => Nomnichi, :kinro => Kinro, - :weather => Weather + :weather => Weather, + :cleaner => Cleaner } if scraps[scrap_name] config = Config.load(scrap_name) @@ -26,6 +27,7 @@ def self.open(scrap_name) autoload :Nomnichi, "#{dir}/nomnichi.rb" autoload :Kinro, "#{dir}/kinro.rb" autoload :Weather, "#{dir}/weather.rb" + autoload :Cleaner, "#{dir}/cleaner.rb" end # module Scrap end # module Nomrat diff --git a/lib/nomrat/scrap/cleaner.rb b/lib/nomrat/scrap/cleaner.rb new file mode 100644 index 0000000..30fc322 --- /dev/null +++ b/lib/nomrat/scrap/cleaner.rb @@ -0,0 +1,56 @@ +require "json" + +module Nomrat + module Scrap + class Cleaner < Base + class Article + attr_reader :date, :cleaner + + def initialize(date, cleaner) + @date, @cleaner = date, cleaner + @date = Date.parse(date) if date.is_a?(String) + end + end # class Article + + def initialize(config = nil) + @token = config["token"] + @channel = config["channel"] + @members = create_members + + @articles = create_articles(fetch_content(config)) + end + + private + + def create_articles(content) + messages = JSON.parse(content)["messages"] + cleaner_messages = messages.select{|m| m["text"] =~ /掃除を完了しました/} + articles = cleaner_messages.map do |m| + time = Time.at(m["ts"].to_i) + date = Date.new(time.year, time.month, time.day) + cleaner = @members[m["user"]] + Article.new(date, cleaner) + end + return articles + end + + def page_url + "https://slack.com/api/channels.history?token=#{@token}&channel=#{channel_id}" + end + + def create_members + members_info = JSON.parse(open("https://slack.com/api/users.list?token=#{@token}").read)["members"] + h = Hash.new + members_info.each do |m| + h[m["id"]] = m["name"] + end + h + end + + def channel_id + channels_info = JSON.parse(open("https://slack.com/api/channels.list?token=#{@token}").read)["channels"] + channel_info = channels_info.select{|c| c["name"] == @channel}.first["id"] + end + end # class Cleaner + end # module Scrap +end # module Nomrat