Hello,

I am trying to set up a presence protocol for access to a particular server's 
resources using finch and DBUS.

On this I do not have much choice, as this is what happens manually right now.

I would like to automate most of the case though, so I switched from pidgin to 
finch (so no need for SSH forwarding, which causes issues with pidgin -m),

and plan to write some scripts to make it easier to change the current status 
for the account used on a particular server.

I am very confused about the differences between

status
status_id
status_type
account vs presence
...

I have a vague idea that I tried to implement, but it does not work.
I don't get errors, but when I look at the finch client, it does not show any 
change in the status.

The finch client on the server has already multiple accounts configured, each 
corresponding to a particular contended resource.

On ssh login, I would like to run a script to acquire that resource, and if it 
works, the status for that account should be
"Do Not Disturb", with the firstname of the user appended to the message.

When freeing that resource, the status for the account corresponding to that 
resource should be set to "Available".

Thank you for any help. Here is what I have:

#! /usr/bin/python3

import sys
import dbus
from pydbus import SessionBus

def usage():
    text = '''
    ./presence.py busy FIRSTNAME ACCOUNT
    ./presence.py avail FIRSTNAME ACCOUNT

    FIRSTNAME: first name.
    ACCOUNT: the alias of the account presence to change
    
    Example:

    ./presence.py busy claudio resource5
                --> sets resource5 to busy with msg: "claudio using resource5"
    ./presence.py avail claudio resource5
                --> claudio frees up resource5, status set to avail.
    '''
    print(text)
    sys.exit(1)

#sys.argv = ["./presence.py", "busy", "claudio", "resource5"]
    
if len(sys.argv) != 4:
    print(len(sys.argv))
    usage()

if (sys.argv[1]) == "busy":
    arg_status = "Do Not Disturb"
elif (sys.argv[1]) == "avail":
    arg_status = "Available"
else:
    usage()

arg_firstname = sys.argv[2]
arg_account = sys.argv[3]

print("presence: connecting to PurpleService")

bus = SessionBus()
try:
    p = bus.get("im.pidgin.purple.PurpleService",
                "/im/pidgin/purple/PurpleObject")
except:
    sys.exit("presence: failed to connect to PurpleService")

accounts = p.PurpleAccountsGetAll()

if len(accounts) == 0:
    sys.exit("presence: no account found.")

for account in accounts:
    alias = p.PurpleAccountGetAlias(account)
    print(alias + " is accountid " + str(account))
    if (alias != arg_account):
        print("presence: skipping account " + alias)
        continue

    print("presence: found account " + alias)

    presence = p.PurpleAccountGetPresence(account)
    status = p.PurplePresenceGetActiveStatus(presence)
    status_type = p.PurpleStatusGetType(status)
    status_type_name = p.PurpleStatusTypeGetName(status_type)

    if (status_type_name == arg_status):
        sys.exit("presence: account is already " + arg_status)

    status_type_list = p.PurpleAccountGetStatusTypes(account)
    status_id = "";

    for status_type in status_type_list:
        status_type_name = p.PurpleStatusTypeGetName(status_type)
        print("status_type_name in status_type_list = " + status_type_name)
        if (status_type_name == arg_status):
            status_id = p.PurpleStatusTypeGetId(status_type)

    if (status_id == ""):
        sys.exit("presence: no status type " + arg_status + " found.")

    status = p.PurpleStatusNew(status_type, presence)
    if (arg_status == "Do Not Disturb"):
        p.PurpleStatusSetAttrString(status, "message", arg_firstname +
                                    " on " + alias)
    pres_statuses = p.PurplePresenceGetStatuses(presence)
    for pres_status in pres_statuses:
        print("Presence status old " + str(pres_status))

    p.PurplePresenceAddStatus(presence, status)

    pres_statuses = p.PurplePresenceGetStatuses(presence)
    for pres_status in pres_statuses:
        print("Presence status new " + str(pres_status))

    status_id = p.PurpleStatusGetId(status)
    p.PurplePresenceSetStatusActive(presence, status_id, True)
    p.PurplePresenceSwitchStatus(presence, status_id)
    p.PurpleAccountSetStatusList(account, status_id, True, 0)

_______________________________________________
Support@pidgin.im mailing list
Want to unsubscribe?  Use this link:
https://pidgin.im/cgi-bin/mailman/listinfo/support

Reply via email to