pidgin/pidgin
Clone
Summary
Browse
Changes
Graph
merge of '77693555855fe9cd3215414f79964dba346cc5fa'
gaim
2008-11-12, Richard Laager
1966704b3e42
file is
Executable
merge of '77693555855fe9cd3215414f79964dba346cc5fa'
and '19a87e98e5857ad0289f2c760d460f7f1dbbb42d'
#!/usr/bin/python
import
dbus
import
re
import
sys
import
time
import
urllib
obj
=
dbus
.
SessionBus
()
.
get_object
(
"net.sf.gaim.GaimService"
,
"/net/sf/gaim/GaimObject"
)
gaim
=
dbus
.
Interface
(
obj
,
"net.sf.gaim.GaimInterface"
)
class
CheckedObject
:
def
__init__
(
self
,
obj
):
self
.
obj
=
obj
def
__getattr__
(
self
,
attr
):
return
CheckedAttribute
(
self
,
attr
)
class
CheckedAttribute
:
def
__init__
(
self
,
cobj
,
attr
):
self
.
cobj
=
cobj
self
.
attr
=
attr
def
__call__
(
self
,
*
args
):
result
=
self
.
cobj
.
obj
.
__getattr__
(
self
.
attr
)(
*
args
)
if
result
==
0
:
raise
"Error: "
+
self
.
attr
+
" "
+
str
(
args
)
+
" returned "
+
str
(
result
)
return
result
cgaim
=
CheckedObject
(
gaim
)
def
extendlist
(
list
,
length
,
fill
):
if
len
(
list
)
<
length
:
return
list
+
[
fill
]
*
(
length
-
len
(
list
))
else
:
return
list
def
convert
(
value
):
try
:
return
int
(
value
)
except
:
return
value
def
findaccount
(
protocolname
,
accountname
=
""
):
try
:
# prefer connected accounts
account
=
cgaim
.
GaimAccountsFindConnected
(
accountname
,
protocolname
)
return
account
except
:
# try to get any account and connect it
account
=
cgaim
.
GaimAccountsFindAny
(
accountname
,
protocolname
)
gaim
.
GaimAccountSetStatusVargs
(
account
,
"online"
,
1
)
gaim
.
GaimAccountConnect
(
account
)
return
account
def
goim
(
account
,
screenname
,
message
=
None
):
# XXX: 1 == GAIM_CONV_TYPE_IM
conversation
=
cgaim
.
GaimConversationNew
(
1
,
account
,
screenname
)
if
message
:
gaim
.
GaimConvSendConfirm
(
conversation
,
message
)
def
gochat
(
account
,
params
,
message
=
None
):
connection
=
cgaim
.
GaimAccountGetConnection
(
account
)
gaim
.
ServJoinChat
(
connection
,
params
)
if
message
!=
None
:
for
i
in
range
(
20
):
# XXX: 2 == GAIM_CONV_TYPE_CHAT
conversation
=
gaim
.
GaimFindConversationWithAccount
(
2
,
params
.
get
(
"channel"
,
params
.
get
(
"room"
)),
account
)
if
conversation
:
gaim
.
GaimConvSendConfirm
(
conversation
,
message
)
break
else
:
time
.
sleep
(
0.5
)
def
addbuddy
(
account
,
screenname
,
group
=
""
,
alias
=
""
):
cgaim
.
GaimBlistRequestAddBuddy
(
account
,
screenname
,
group
,
alias
)
def
aim
(
uri
):
protocol
=
"prpl-oscar"
match
=
re
.
match
(
r
"^(aim|icq):([^?]*)(\?(.*))"
,
uri
)
if
not
match
:
print
"Invalid aim URI:
%s
"
%
uri
return
command
=
urllib
.
unquote_plus
(
match
.
group
(
2
))
paramstring
=
match
.
group
(
4
)
params
=
{}
if
paramstring
:
for
param
in
paramstring
.
split
(
"&"
):
key
,
value
=
extendlist
(
param
.
split
(
"="
,
1
),
2
,
""
)
params
[
key
]
=
urllib
.
unquote_plus
(
value
)
accountname
=
params
.
get
(
"account"
,
""
)
screenname
=
params
.
get
(
"screenname"
,
""
)
account
=
findaccount
(
protocol
,
accountname
)
if
command
.
lower
()
==
"goim"
:
goim
(
account
,
screenname
,
params
.
get
(
"message"
))
elif
command
.
lower
()
==
"gochat"
:
gochat
(
account
,
params
)
elif
command
.
lower
()
==
"addbuddy"
:
addbuddy
(
account
,
screenname
,
params
.
get
(
"group"
,
""
))
def
gg
(
uri
):
protocol
=
"prpl-gg"
match
=
re
.
match
(
r
"^gg:(.*)"
,
uri
)
if
not
match
:
print
"Invalid gg URI:
%s
"
%
uri
return
screenname
=
urllib
.
unquote_plus
(
match
.
group
(
1
))
account
=
findaccount
(
protocol
)
goim
(
account
,
screenname
)
def
icq
(
uri
):
aim
(
uri
)
def
irc
(
uri
):
protocol
=
"prpl-irc"
match
=
re
.
match
(
r
"^irc:(//([^/]*)/)?([^?]*)(\?(.*))?"
,
uri
)
if
not
match
:
print
"Invalid irc URI:
%s
"
%
uri
return
server
=
urllib
.
unquote_plus
(
match
.
group
(
2
))
or
""
target
=
match
.
group
(
3
)
or
""
query
=
match
.
group
(
5
)
or
""
modifiers
=
{}
if
target
:
for
modifier
in
target
.
split
(
","
)[
1
:]:
modifiers
[
modifier
]
=
True
isnick
=
modifiers
.
has_key
(
"isnick"
)
paramstring
=
match
.
group
(
5
)
params
=
{}
if
paramstring
:
for
param
in
paramstring
.
split
(
"&"
):
key
,
value
=
extendlist
(
param
.
split
(
"="
,
1
),
2
,
""
)
params
[
key
]
=
urllib
.
unquote_plus
(
value
)
account
=
findaccount
(
protocol
)
if
(
target
!=
""
):
if
(
isnick
):
goim
(
account
,
urllib
.
unquote_plus
(
target
.
split
(
","
)[
0
]),
params
.
get
(
"msg"
))
else
:
channel
=
urllib
.
unquote_plus
(
target
.
split
(
","
)[
0
])
if
channel
[
0
]
!=
"#"
:
channel
=
"#"
+
channel
gochat
(
account
,
{
"server"
:
server
,
"channel"
:
channel
,
"password"
:
params
.
get
(
"key"
,
""
)},
params
.
get
(
"msg"
))
def
msnim
(
uri
):
protocol
=
"prpl-msn"
match
=
re
.
match
(
r
"^msnim:([^?]*)(\?(.*))"
,
uri
)
if
not
match
:
print
"Invalid msnim URI:
%s
"
%
uri
return
command
=
urllib
.
unquote_plus
(
match
.
group
(
1
))
paramstring
=
match
.
group
(
3
)
params
=
{}
if
paramstring
:
for
param
in
paramstring
.
split
(
"&"
):
key
,
value
=
extendlist
(
param
.
split
(
"="
,
1
),
2
,
""
)
params
[
key
]
=
urllib
.
unquote_plus
(
value
)
screenname
=
params
.
get
(
"contact"
,
""
)
account
=
findaccount
(
protocol
)
if
command
.
lower
()
==
"chat"
:
goim
(
account
,
screenname
)
elif
command
.
lower
()
==
"add"
:
addbuddy
(
account
,
screenname
)
def
sip
(
uri
):
protocol
=
"prpl-simple"
match
=
re
.
match
(
r
"^sip:(.*)"
,
uri
)
if
not
match
:
print
"Invalid sip URI:
%s
"
%
uri
return
screenname
=
urllib
.
unquote_plus
(
match
.
group
(
1
))
account
=
findaccount
(
protocol
)
goim
(
account
,
screenname
)
def
xmpp
(
uri
):
protocol
=
"prpl-jabber"
match
=
re
.
match
(
r
"^xmpp:((//)?([^/?#]*))?(/?([^?#]*))(\?([^;#]*)(;([^#]*))?)?(#(.*))?"
,
uri
)
if
not
match
:
print
"Invalid xmpp URI:
%s
"
%
uri
return
tmp
=
match
.
group
(
3
)
if
(
tmp
):
accountname
=
urllib
.
unquote_plus
(
tmp
)
else
:
accountname
=
""
screenname
=
urllib
.
unquote_plus
(
match
.
group
(
5
))
tmp
=
match
.
group
(
7
)
if
(
tmp
):
command
=
urllib
.
unquote_plus
(
tmp
)
else
:
command
=
""
paramstring
=
match
.
group
(
9
)
params
=
{}
if
paramstring
:
for
param
in
paramstring
.
split
(
";"
):
key
,
value
=
extendlist
(
param
.
split
(
"="
,
1
),
2
,
""
)
params
[
key
]
=
urllib
.
unquote_plus
(
value
)
account
=
findaccount
(
protocol
,
accountname
)
if
command
.
lower
()
==
"message"
:
goim
(
account
,
screenname
,
params
.
get
(
"body"
))
elif
command
.
lower
()
==
"join"
:
room
,
server
=
screenname
.
split
(
"@"
)
gochat
(
account
,
{
"room"
:
room
,
"server"
:
server
})
elif
command
.
lower
()
==
"roster"
:
addbuddy
(
account
,
screenname
,
params
.
get
(
"group"
,
""
),
params
.
get
(
"name"
,
""
))
else
:
goim
(
account
,
screenname
)
def
ymsgr
(
uri
):
protocol
=
"prpl-yahoo"
match
=
re
.
match
(
r
"^ymsgr:([^?]*)(\?([^&]*)(&(.*))?)"
,
uri
)
if
not
match
:
print
"Invalid ymsgr URI:
%s
"
%
uri
return
command
=
urllib
.
unquote_plus
(
match
.
group
(
1
))
screenname
=
urllib
.
unquote_plus
(
match
.
group
(
3
))
paramstring
=
match
.
group
(
5
)
params
=
{}
if
paramstring
:
for
param
in
paramstring
.
split
(
"&"
):
key
,
value
=
extendlist
(
param
.
split
(
"="
,
1
),
2
,
""
)
params
[
key
]
=
urllib
.
unquote_plus
(
value
)
account
=
findaccount
(
protocol
)
if
command
.
lower
()
==
"sendim"
:
goim
(
account
,
screenname
,
params
.
get
(
"m"
))
elif
command
.
lower
()
==
"chat"
:
gochat
(
account
,
{
"room"
:
screenname
})
elif
command
.
lower
()
==
"addfriend"
:
addbuddy
(
account
,
screenname
)
def
main
(
argv
=
sys
.
argv
):
if
len
(
argv
)
!=
2
:
print
"Usage:
%s
URI"
%
argv
[
0
]
print
"Example:
%s
\"
xmpp:romeo@montague.net?message
\"
"
%
argv
[
0
]
return
uri
=
argv
[
1
]
type
=
uri
.
split
(
":"
)[
0
]
if
type
==
"aim"
:
aim
(
uri
)
elif
type
==
"gg"
:
gg
(
uri
)
elif
type
==
"icq"
:
icq
(
uri
)
elif
type
==
"irc"
:
irc
(
uri
)
elif
type
==
"msnim"
:
msnim
(
uri
)
elif
type
==
"sip"
:
sip
(
uri
)
elif
type
==
"xmpp"
:
xmpp
(
uri
)
elif
type
==
"ymsgr"
:
ymsgr
(
uri
)
else
:
print
"Unkown protocol:
%s
"
%
type
if
__name__
==
"__main__"
:
main
()