| 1 | #! /usr/bin/ruby |
|---|
| 2 | require 'drb' |
|---|
| 3 | require 'optparse' |
|---|
| 4 | |
|---|
| 5 | #++ |
|---|
| 6 | # |
|---|
| 7 | # :title: RemoteCtl example script |
|---|
| 8 | # |
|---|
| 9 | # Author:: jsn (dmitry kim) <dmitry dot kim at gmail dot org> |
|---|
| 10 | # Copyright:: (C) 2007 dmitry kim |
|---|
| 11 | # License:: in public domain |
|---|
| 12 | |
|---|
| 13 | user = nil |
|---|
| 14 | pw = nil |
|---|
| 15 | dst = nil |
|---|
| 16 | uri = 'druby://localhost:7268' |
|---|
| 17 | |
|---|
| 18 | opts = OptionParser.new |
|---|
| 19 | opts.on('-u', '--user <user>', "remote user (mandatory)") { |v| user = v } |
|---|
| 20 | opts.on('-p', '--password <pw>', "remote user password (mandatory)") { |v| pw = v } |
|---|
| 21 | opts.on('-d', '--destination <user or #channel>') { |v| dst = v } |
|---|
| 22 | opts.on('-r', '--uri <drb uri>', "rbot url (#{uri})") { |v| uri = v } |
|---|
| 23 | opts.on('-h', '--help', "this message") { |v| pw = nil } # sorry! |
|---|
| 24 | opts.on('-a', '--about', "what it's all about.") { |v| |
|---|
| 25 | puts <<EOF |
|---|
| 26 | This is just a proof-of-concept example for rbot druby-based api. This program |
|---|
| 27 | reads lines of text from the standard input and sends them to a specified irc |
|---|
| 28 | channel or user via rbot. Make sure you have remotectl.rb plugin loaded before |
|---|
| 29 | use. |
|---|
| 30 | |
|---|
| 31 | The necessary setup is: |
|---|
| 32 | 1) # create a new rbot user ("rmuser", in this example) with a password |
|---|
| 33 | # ("rmpw", in this example). in an open query to rbot: |
|---|
| 34 | |
|---|
| 35 | <you> user create rmuser rmpw |
|---|
| 36 | <rbot> created botuser remote |
|---|
| 37 | |
|---|
| 38 | 2) # add a remotectl permission to your newly created remote user: |
|---|
| 39 | |
|---|
| 40 | <you> permissions set +remotectl for rmuser |
|---|
| 41 | <rbot> okies! |
|---|
| 42 | |
|---|
| 43 | 3) # add specific permissions for the commands you want to allow via |
|---|
| 44 | # remote interface. for example, in this script we want 'say', |
|---|
| 45 | # 'action' and other basic commands to work: |
|---|
| 46 | |
|---|
| 47 | <you> permissions set +basics::talk::do for rmuser |
|---|
| 48 | <rbot> alright |
|---|
| 49 | |
|---|
| 50 | 4) # run the #{$0} and type something. the message should |
|---|
| 51 | # show up on your channel / arrive as an irc private message. |
|---|
| 52 | |
|---|
| 53 | [you@yourhost ~]$ ./bin/rbot-remote -u rmuser -p rmpw -d '#your-channel' |
|---|
| 54 | hello, world! |
|---|
| 55 | <Ctrl-D> |
|---|
| 56 | [you@yourhost ~]$ |
|---|
| 57 | EOF |
|---|
| 58 | exit 0 |
|---|
| 59 | } |
|---|
| 60 | opts.parse! |
|---|
| 61 | |
|---|
| 62 | if !pw || !user || !dst |
|---|
| 63 | puts opts.to_s |
|---|
| 64 | exit 0 |
|---|
| 65 | end |
|---|
| 66 | |
|---|
| 67 | rbot = DRbObject.new_with_uri(uri) |
|---|
| 68 | id = rbot.delegate(nil, "remote login #{user} #{pw}")[:return] |
|---|
| 69 | puts "id is #{id.inspect}" |
|---|
| 70 | loop { |
|---|
| 71 | s = gets or break |
|---|
| 72 | s.chomp! |
|---|
| 73 | rv = rbot.delegate(id, "dispatch say #{dst} #{s}") or break |
|---|
| 74 | puts "rv is #{rv.inspect}" |
|---|
| 75 | } |
|---|
| 76 | |
|---|