View in color | License | Download script | History | Other scripts by: skurunner |
30-Apr 15:49 UTC
[0.069] 15.191k
[0.069] 15.191k
rim-bot.rREBOL [
Title: "RIM Bot"
Date: 1-Jun-2001/18:30-7:00
Version: 0.6.0
File: %rim-bot.r
Author: "Ryan S. Cole"
Purpose: {Provides easy to use interface into RIM (Rebol Instant Messenger) communications.}
Email: %ryanc--iesco-dms--com
Web: http://www.sonic.net/~gaia/RIM/rim-bot.html
Comments: {
0.5.2 Change defualt Announce-Frequency to 00:00:30 from 00:00:01 to prevent collisions.
0.6.0 Change who-is, returns none if not found instead of "someone". Added new functionality to it too.
Added Call function
Added Disconnect function
fixed listen/no-wait
}
library: [
level: none
platform: none
type: 'tool
domain: [tcp ldc]
tested-under: none
support: none
license: none
see-also: none
]
]
RIM-Bot: Make Object! [
name: "RIM-Bot"
Welcoming: yes ; adds new connections to contacts automatically
Welcome-msg: none
Port: "7070"
Announce-site: http://www.reboltech.com/cgi/rebol
Announce-frequency: 00:00:30
Listen-port: none
then: now
Contacts: [] ; People your talking to
User-List: [] ; People on the RIM user list
Init: does [
Listen-port: open/lines rejoin [ tcp://: port ]
Announce
]
Announce: does [
either error? try [
User-List: load rejoin [
announce-site
"/lookup.r?cmd=post&service=chat&name=" name
"&data=" to-string port
] ] [
none
] [
User-List
]
]
Shutdown: does [
error? try [ read rejoin [
announce-site
"/lookup.r?cmd=remove&service=chat&name=" name
]
]
error? try [ close listen-port ]
foreach port contacts [ error? try [ close port ] ]
]
Call: Function [
"Establishes connection with user in user-list."
Identifier [String! Tuple!]
] [
info
] [
info: who-is/info Identifier
any [
if block? info [
if not error? try [append contacts open/lines rejoin [ tcp:// info/2 ":" info/4] ] [
last contacts
]
]
]
]
Disconnect: Function [
"Close connection with user."
Identifier [String! Tuple! Port!]
] [
] [
if port? Identifier [ error? try [ close Identifier ] return True ]
if none? Identifier: who-is/port Identifier [ return False ]
error? try [ close Identifier ]
return True
]
Speak: function [
"Send message to current contacts."
msg "Message to send."
/to Whom "Specified contact."
/not-to Excluded "Do not speak to specified contact."
] [
] [
either to [
if not all [ not-to Whom = Excluded ] [ Insert Whom msg ]
] [
foreach person contacts [
if not all [ not-to person = excluded ] [
insert person msg
]
]
]
msg
]
Listen: Function [
"Listen for messages, returns port."
/to whom "Listen to a particular port."
/interupt "Stop listening on console input."
/no-wait
] [
speaker
wait-on
console
] [
either to [
wait-on: reduce [whom]
] [
append wait-on: copy contacts reduce [listen-port]
]
if interupt [ append wait-on make port! [ scheme: 'console ] ]
append wait-on either no-wait [0] [Announce-frequency]
until [
if (now - Announce-frequency > then) [ announce then: now ]
something: wait wait-on
if port? something [
if something/scheme = 'console [ return none ]
either something = listen-port [
speaker: first something
if welcoming [ append contacts speaker ]
if welcome-msg [ insert speaker welcome-msg ]
] [
speaker: something
]
]
if any [ no-wait none? speaker ] [ return none ]
speaker
]
]
hear: function [
"Reads a message from a port."
Whom [Port! None!]
] [
heard
] [
if error? try [ heard: first whom ] [
remove find contacts whom
]
heard
]
Who-is: function [
"Finds users name in users list."
reference [port! string! tuple! none!]
/Port "Find users port."
/Info "Get user's information block."
] [
rv
] [
rv: any [
if port? reference [ first back any [ find user-list reference/remote-ip [none] ] ]
if tuple? reference [ first back any [ find user-list reference [none] ] ]
if string? reference [ first any [ find user-list reference [none] ] ]
]
if all [ rv any [ Port Info ] ] [
either rv: find user-list rv [rv: copy/part rv 4] [rv: none]
]
if all [ rv Port ] [
rv: any [ foreach p contacts [ if p/remote-ip = rv/2 [ rv: p ] ] ]
]
rv
]
] Notes
|