Editing XMPPHP
From JaWiki (Jabber/XMPP wiki)
Warning: The database has been locked for maintenance, so you will not be able to save your edits right now. You may wish to copy and paste your text into a text file and save it for later.
The administrator who locked it offered this explanation: MediaWiki upgrading
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
{{stub}} | {{stub}} | ||
{{Library | {{Library | ||
− | | name= | + | | name=XMPPPHP |
| url=http://code.google.com/p/xmpphp/ | | url=http://code.google.com/p/xmpphp/ | ||
− | | author=[ | + | | author=[http://nathan.fritzclan.com/ Nathan Fritz] |
| language={{Lang|l|PHP}} | | language={{Lang|l|PHP}} | ||
− | | license= | + | | license=GNU General Public License v2 |
− | | roster= | + | | roster=поддерживается |
}} | }} | ||
− | XMPPHP | + | XMPPHP - класс на PHP5, являющийся наследником [[Class.jabber.php]]. |
− | + | {{fixme|так есть там или нет поддержка ростера? я что-то не понял. [[User:Vindicar|Vindicar]] 13:55, 11 April 2009 (GMT)}} | |
− | + | class Roster { | |
− | + | /** | |
− | + | * Roster array, handles contacts and presence. Indexed by jid. | |
− | + | * Contains array with potentially two indexes 'contact' and 'presence' | |
− | + | * @var array | |
− | + | */ | |
− | + | protected $roster_array = array(); | |
− | + | /** | |
− | + | * Constructor | |
+ | * | ||
+ | */ | ||
+ | public function __construct($roster_array = array()) { | ||
+ | if ($this->verifyRoster($roster_array)) { | ||
+ | $this->roster_array = $roster_array; //Allow for prepopulation with existing roster | ||
+ | } else { | ||
+ | $this->roster_array = array(); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * | ||
+ | * Check that a given roster array is of a valid structure (empty is still valid) | ||
+ | * | ||
+ | * @param array $roster_array | ||
+ | */ | ||
+ | protected function verifyRoster($roster_array) { | ||
+ | #TODO once we know *what* a valid roster array looks like | ||
+ | return True; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * | ||
+ | * Add given contact to roster | ||
+ | * | ||
+ | * @param string $jid | ||
+ | * @param string $subscription | ||
+ | * @param string $name | ||
+ | * @param array $groups | ||
+ | */ | ||
+ | public function addContact($jid, $subscription, $name='', $groups=array()) { | ||
+ | $contact = array('jid' => $jid, 'subscription' => $subscription, 'name' => $name, 'groups' => $groups); | ||
+ | if ($this->isContact($jid)) { | ||
+ | $this->roster_array[$jid]['contact'] = $contact; | ||
+ | } else { | ||
+ | $this->roster_array[$jid] = array('contact' => $contact); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * | ||
+ | * Retrieve contact via jid | ||
+ | * | ||
+ | * @param string $jid | ||
+ | */ | ||
+ | public function getContact($jid) { | ||
+ | if ($this->isContact($jid)) { | ||
+ | return $this->roster_array[$jid]['contact']; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * | ||
+ | * Discover if a contact exists in the roster via jid | ||
+ | * | ||
+ | * @param string $jid | ||
+ | */ | ||
+ | public function isContact($jid) { | ||
+ | return (array_key_exists($jid, $this->roster_array)); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * | ||
+ | * Set presence | ||
+ | * | ||
+ | * @param string $presence | ||
+ | * @param integer $priority | ||
+ | * @param string $show | ||
+ | * @param string $status | ||
+ | */ | ||
+ | public function setPresence($presence, $priority, $show, $status) { | ||
+ | list($jid, $resource) = split("/", $presence); | ||
+ | if ($show != 'unavailable') { | ||
+ | if (!$this->isContact($jid)) { | ||
+ | $this->addContact($jid, 'not-in-roster'); | ||
+ | } | ||
+ | $resource = $resource ? $resource : ''; | ||
+ | $this->roster_array[$jid]['presence'][$resource] = array('priority' => $priority, 'show' => $show, 'status' => $status); | ||
+ | } else { //Nuke unavailable resources to save memory | ||
+ | unset($this->roster_array[$jid]['resource'][$resource]); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | /* | ||
+ | * | ||
+ | * Return best presence for jid | ||
+ | * | ||
+ | * @param string $jid | ||
+ | */ | ||
+ | public function getPresence($jid) { | ||
+ | $split = split("/", $jid); | ||
+ | $jid = $split[0]; | ||
+ | if($this->isContact($jid)) { | ||
+ | $current = array('resource' => '', 'active' => '', 'priority' => -129, 'show' => '', 'status' => ''); //Priorities can only be -128 = 127 | ||
+ | foreach($this->roster_array[$jid]['presence'] as $resource => $presence) { | ||
+ | //Highest available priority or just highest priority | ||
+ | if ($presence['priority'] > $current['priority'] and (($presence['show'] == "chat" or $presence['show'] == "available") or ($current['show'] != "chat" or $current['show'] != "available"))) { | ||
+ | $current = $presence; | ||
+ | $current['resource'] = $resource; | ||
+ | } | ||
+ | } | ||
+ | return $current; | ||
+ | } | ||
+ | } | ||
+ | /** | ||
+ | * | ||
+ | * Get roster | ||
+ | * | ||
+ | */ | ||
+ | public function getRoster() { | ||
+ | return $this->roster_array; | ||
+ | } |