/usr/share/nadoka/plugins/twitterbot.nb is in nadoka 0.7.5-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 | # -*-ruby-*-
# nadoka-twit
#
# = Usage
#
# == Get consumer key
#
# 1. access https://twitter.com/apps/new
# 2. register it
# 3. memo 'Consumer key' and 'Consumer secret'
#
# == Get access token
#
# 1. run this script with consumer key and consumer secret like:
# ruby twitterbot.nb <consumer_key> <consumer_secret>
# 2. memo access_token and access_token_secret
#
# == Setting nadokarc
#
# 1. set :consumer_key, :consumer_secret, :access_token,
# and :acccess_token_secret
#
# = Configuration
#
# == :ch
#
# target channel
#
# == :pattern
#
# pattern for messages to send twitter
#
# == :nkf_encoding
#
# the encoding of messages
#
# == :consumer_key, :consumer_secret
#
# Consumer key and consumer secret
#
# == :access_token, :acccess_token_secret
#
# Access token and access token secret
#
require 'time'
require 'rubygems'
require 'rubytter'
if __FILE__ == $0
key = ARGV.shift
secret = ARGV.shift
unless key && secret
puts "Usage: #$0 <consumer_key> <consumer_secret>"
end
oauth = Rubytter::OAuth.new(key, secret)
request_token = oauth.get_request_token
system('open', request_token.authorize_url) || puts("Access here: #{request_token.authorize_url}\nand...")
print "Enter PIN: "
pin = gets.strip
access_token = request_token.get_access_token(
:oauth_token => request_token.token,
:oauth_verifier => pin
)
puts ":access_token => '#{access_token.token}',"
puts ":access_token_secret => '#{access_token.secret}',"
exit
end
class TwitterBot < Nadoka::NDK_Bot
def bot_initialize
@ch = @bot_config.fetch(:ch, nil)
@pattern = @bot_config.fetch(:pattern, />tw$/)
@nkf_encoding = @bot_config.fetch(:nkf_encoding, nil)
consumer = OAuth::Consumer.new(
@bot_config.fetch(:consumer_key, nil),
@bot_config.fetch(:consumer_secret, nil),
:site => 'http://twitter.com')
access_token = OAuth::AccessToken.new(consumer,
@bot_config.fetch(:access_token, nil),
@bot_config.fetch(:access_token_secret, nil))
@rt = OAuthRubytter.new(access_token)
@current_id = -1
end
def on_timer(t)
@rt.friends_timeline.each do |status|
id = status.id.to_i
next unless @current_id < id
@current_id = id
time = Time.parse(status.created_at)
next if time + 5 * 60 < Time.now
text = status.text.tr("\r\n", ' ')
text = NKF.nkf('--ic=UTF-8 --oc=' + @nkf_encoding, text) if @nkf_encoding
send_notice @ch, "#{time.strftime('%H:%M')} #{status.user.screen_name}: #{text}"
end
rescue Exception => err
puts_error_message(err)
end
def on_client_privmsg(client, ch, message)
return unless @ch.nil? or @ch.upcase == ch.upcase
unless @pattern =~ message
slog 'pattern unmatch, ignored'
return
end
text = message.sub(@pattern, '')
text = NKF.nkf('--oc=UTF-8 --ic=' + @nkf_encoding, text) if @nkf_encoding
slog((@rt.update(text) ? 'sent to twitter: ' : 'twitter send faild: ') + message)
rescue Exception => err
puts_error_message(err)
end
def slog(msg, nostamp = false)
current_method = caller.first[/:in \`(.*?)\'/, 1].to_s
msg.each do |line|
@logger.slog "#{self.class.to_s}##{current_method} #{line}", nostamp
end
end
private
def puts_error_message(err)
if err.is_a?(Rubytter::APIError)
@logger.slog "%s: %s (%s) %s" % [err.backtrace[0], err.message, err.class, err.response]
else
@logger.slog "%s: %s (%s)" % [err.backtrace[0], err.message, err.class]
end
@logger.slog err.backtrace.select{|l|/\A\/home/=~l}
end
end
|