From 03e7d4e28fc7e7b2c6e27f2230f0ed38ddaeeb62 Mon Sep 17 00:00:00 2001 From: Joel McCoy Date: Fri, 2 Jan 2015 18:05:36 -0500 Subject: [PATCH] Fix unfollow, add block, fix missing interval assignments --- boodoo.rb | 19 ++++++++++++++++++- bots.rb | 24 ++++++++++++------------ defaults.env | 1 + 3 files changed, 31 insertions(+), 13 deletions(-) diff --git a/boodoo.rb b/boodoo.rb index 0d609b3..4266b8c 100644 --- a/boodoo.rb +++ b/boodoo.rb @@ -63,6 +63,13 @@ class Ebooks::Boodoo::BoodooBot < Ebooks::Bot 'access_token', 'access_token_secret', 'bot_name', 'original'] + # Unfollow a user -- OVERRIDE TO FIX TYPO + # @param user [String] username or user id + def unfollow(user, *args) + log "Unfollowing #{user}" + twitter.unfollow(user, *args) + end + # A rough error-catch/retry for rate limit, dupe fave, server timeouts def catch_twitter begin @@ -127,6 +134,16 @@ class Ebooks::Boodoo::BoodooBot < Ebooks::Bot @archive = Archive.new(@original, @archive_path, make_client).sync end + def block(targets) + if targets.kind_of? String + targets = parse_array(targets) + end + targets.each do |target| + log "Blocking @#{target}" + Twitter::REST::Request.new(@twitter, :post, "1.1/blocks/create.json", {:screen_name => target}).perform + end + end + def make_model! log "Updating model: #{@model_path}" Ebooks::Model.consume(@archive_path).save(@model_path) @@ -140,7 +157,7 @@ class Ebooks::Boodoo::BoodooBot < Ebooks::Bot def missing_fields $required_fields.select { |field| - p "#{field} = #{send(field)}" + # p "#{field} = #{send(field)}" send(field).nil? || send(field).empty? } end diff --git a/bots.rb b/bots.rb index d8bff3d..54bbbdd 100644 --- a/bots.rb +++ b/bots.rb @@ -37,11 +37,13 @@ class BoodooBot @access_token = SETTINGS['ACCESS_TOKEN'] @access_token_secret =SETTINGS['ACCESS_TOKEN_SECRET'] @tweet_interval = SETTINGS['TWEET_INTERVAL'] + @update_follows_interval = SETTINGS['UPDATE_FOLLOWS_INTERVAL'] + @refresh_model_interval = SETTINGS['REFRESH_MODEL_INTERVAL'] # @pester_period = SETTINGS['PESTER_PERIOD'] # String fields forced to downcase: - @bot_name = SETTINGS['BOT_NAME'].downcase - @original = SETTINGS['SOURCE_USERNAME'].downcase + @bot_name = SETTINGS['BOT_NAME'] + @original = SETTINGS['SOURCE_USERNAME'] # Array fields are CSV or SSV @blacklist = parse_array(SETTINGS['BLACKLIST']) @@ -109,23 +111,21 @@ class BoodooBot end end - def on_direct_message(dm) - from_owner = dm.user.screen_name.downcase == @original + def on_message(dm) + from_owner = dm.sender.screen_name.downcase == @original.downcase + log "[DM from owner? #{from_owner}]" if from_owner action = dm.text.split.first.downcase - strip_re = Regexp.new("^#{command}\s*", "i") + strip_re = Regexp.new("^#{action}\s*", "i") payload = dm.text.sub(strip_re, "") #TODO: Add blacklist/whitelist/reject(banned phrase) #TODO? Move this into a DMController class or equivalent? case action when "tweet" tweet model.make_response(payload, 140) - when "follow" - follow payload - when "unfollow" - unfollow payload - when "block" - block payload + when "follow", "unfollow", "block" + payload = parse_array(payload.gsub("@", ''), / *[,; ]+ */) # Strip @s and make array + send(action.to_sym, payload) when "mention" pre = payload + " " limit = 140 - pre.size @@ -134,7 +134,7 @@ class BoodooBot when "cheating" tweet payload else - log "Don't have behavior for command: #{command}" + log "Don't have behavior for action: #{action}" reply(dm, model.make_response(dm.text)) end else diff --git a/defaults.env b/defaults.env index d3c485b..c1a2728 100644 --- a/defaults.env +++ b/defaults.env @@ -16,3 +16,4 @@ TIMELINE_DELAY=10..600 TIMEOUT_SLEEP=5 MAX_ERROR_RETRIES=10 UPDATE_FOLLOWS_INTERVAL=90m +REFRESH_MODEL_INTERVAL=8h