Created
May 18, 2016 21:54
-
-
Save jbfink/414296b31aa02b0131af2a0bc21430b9 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'twitter_ebooks' | |
# Information about a particular Twitter user we know | |
class UserInfo | |
attr_reader :username | |
# @return [Integer] how many times we can pester this user unprompted | |
attr_accessor :pesters_left | |
# @param username [String] | |
def initialize(username) | |
@username = username | |
@pesters_left = 1 | |
end | |
end | |
class CloneBot < Ebooks::Bot | |
attr_accessor :original, :model, :model_path | |
def configure | |
# Configuration for all CloneBots | |
self.consumer_key = "<consumer key>" | |
self.consumer_secret = "<consumer secret>" | |
self.blacklist = ['kylelehk', 'friedrichsays', 'Sudieofna', 'tnietzschequote', 'NerdsOnPeriod', 'FSR', 'BafflingQuotes', 'Obey_Nxme', 'TayandYou', 'Yobit_SpiderBot'] | |
self.delay_range = 1..6 | |
@userinfo = {} | |
end | |
def top100; @top100 ||= model.keywords.take(100); end | |
def top20; @top20 ||= model.keywords.take(20); end | |
def on_startup | |
load_model! | |
scheduler.cron '0 * * * *' do | |
# Each hour, post a single tweet | |
tweet(model.make_statement) | |
end | |
end | |
def on_message(dm) | |
delay do | |
reply(dm, model.make_response(dm.text)) | |
end | |
end | |
def on_mention(tweet) | |
# Become more inclined to pester a user when they talk to us | |
userinfo(tweet.user.screen_name).pesters_left += 1 | |
delay do | |
reply(tweet, model.make_response(meta(tweet).mentionless, meta(tweet).limit)) | |
end | |
end | |
def on_timeline(tweet) | |
return if tweet.retweeted_status? | |
return unless can_pester?(tweet.user.screen_name) | |
tokens = Ebooks::NLP.tokenize(tweet.text) | |
interesting = tokens.find { |t| top100.include?(t.downcase) } | |
very_interesting = tokens.find_all { |t| top20.include?(t.downcase) }.length > 2 | |
delay do | |
if very_interesting | |
favorite(tweet) if rand < 0.5 | |
#retweet(tweet) if rand < 0.1 | |
if rand < 0.01 | |
userinfo(tweet.user.screen_name).pesters_left -= 1 | |
reply(tweet, model.make_response(meta(tweet).mentionless, meta(tweet).limit)) | |
end | |
elsif interesting | |
favorite(tweet) if rand < 0.05 | |
if rand < 0.001 | |
userinfo(tweet.user.screen_name).pesters_left -= 1 | |
reply(tweet, model.make_response(meta(tweet).mentionless, meta(tweet).limit)) | |
end | |
end | |
end | |
end | |
# Find information we've collected about a user | |
# @param username [String] | |
# @return [Ebooks::UserInfo] | |
def userinfo(username) | |
@userinfo[username] ||= UserInfo.new(username) | |
end | |
# Check if we're allowed to send unprompted tweets to a user | |
# @param username [String] | |
# @return [Boolean] | |
def can_pester?(username) | |
userinfo(username).pesters_left > 0 | |
end | |
# Only follow our original user or people who are following our original user | |
# @param user [Twitter::User] | |
def can_follow?(username) | |
@original.nil? || username == @original || twitter.friendship?(username, @original) | |
end | |
def favorite(tweet) | |
if can_follow?(tweet.user.screen_name) | |
super(tweet) | |
else | |
log "Unfollowing @#{tweet.user.screen_name}" | |
twitter.unfollow(tweet.user.screen_name) | |
end | |
end | |
def on_follow(user) | |
if can_follow?(user.screen_name) | |
follow(user.screen_name) | |
else | |
log "Not following @#{user.screen_name}" | |
end | |
end | |
private | |
def load_model! | |
return if @model | |
@model_path ||= "model/#{original}.model" | |
log "Loading model #{model_path}" | |
@model = Ebooks::Model.load(model_path) | |
end | |
end | |
CloneBot.new("adr_ebooks") do |bot| | |
bot.access_token = "<access token>" | |
bot.access_token_secret = "<access token secret>" | |
bot.original = "adr" | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment