| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | #!/usr/bin/env php
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /* | 
					
						
							|  |  |  |  * Laconica - a distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2008, Controlez-Vous, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 23:05:23 -04:00
										 |  |  | # Abort if called from a web server
 | 
					
						
							|  |  |  | if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { | 
					
						
							|  |  |  | 	print "This script must be run from the command line\n"; | 
					
						
							|  |  |  | 	exit(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | define('INSTALLDIR', dirname(__FILE__)); | 
					
						
							|  |  |  | define('LACONICA', true); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | require_once(INSTALLDIR . '/lib/common.php'); | 
					
						
							| 
									
										
										
										
											2008-06-26 03:07:03 -04:00
										 |  |  | require_once(INSTALLDIR . '/lib/jabber.php'); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 11:12:02 -04:00
										 |  |  | # This is kind of clunky; we create a class to call the global functions
 | 
					
						
							|  |  |  | # in jabber.php, which create a new XMPP class. A more elegant (?) solution
 | 
					
						
							|  |  |  | # might be to use make this a subclass of XMPP.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | class XMPPDaemon { | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 03:59:20 -04:00
										 |  |  | 	function XMPPDaemon($resource=NULL) { | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 		static $attrs = array('server', 'port', 'user', 'password', 'host'); | 
					
						
							| 
									
										
										
										
											2008-06-22 23:09:30 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		foreach ($attrs as $attr) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 			$this->$attr = common_config('xmpp', $attr); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-26 03:59:20 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if ($resource) { | 
					
						
							|  |  |  | 			$this->resource = $resource; | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 		} else { | 
					
						
							|  |  |  | 			$this->resource = common_config('xmpp', 'resource') . 'daemon'; | 
					
						
							| 
									
										
										
										
											2008-06-26 03:59:20 -04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$this->log(LOG_INFO, "{$this->user}@{$this->server}/{$this->resource}"); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function connect() { | 
					
						
							| 
									
										
										
										
											2008-07-05 16:24:12 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 		$connect_to = ($this->host) ? $this->host : $this->server; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->log(LOG_INFO, "Connecting to $connect_to on port $this->port"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$this->conn = jabber_connect($this->resource); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 		if (!$this->conn) { | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-07-05 16:24:12 -04:00
										 |  |  | 	     | 
					
						
							| 
									
										
										
										
											2008-07-05 14:47:29 -04:00
										 |  |  | 		return !$this->conn->isDisconnected(); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function handle() { | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		static $parts = array('message', 'presence', | 
					
						
							|  |  |  | 							  'end_stream', 'session_start'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-05 16:24:12 -04:00
										 |  |  | 		while(!$this->conn->isDisconnected()) { | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			$payloads = $this->conn->processUntil($parts, 10); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if ($payloads) { | 
					
						
							|  |  |  | 				foreach($payloads as $event) { | 
					
						
							|  |  |  | 					$pl = $event[1]; | 
					
						
							|  |  |  | 					switch($event[0]) { | 
					
						
							|  |  |  | 					 case 'message': | 
					
						
							|  |  |  | 						$this->handle_message($pl); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					 case 'presence': | 
					
						
							|  |  |  | 						$this->handle_presence($pl); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					 case 'session_start': | 
					
						
							|  |  |  | 						$this->handle_session($pl); | 
					
						
							|  |  |  | 						break; | 
					
						
							|  |  |  | 					} | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			$this->broadcast_queue(); | 
					
						
							| 
									
										
										
										
											2008-07-06 02:14:37 -04:00
										 |  |  | #			$this->confirmation_queue();
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 14:11:44 -04:00
										 |  |  | 	function get_user($from) { | 
					
						
							|  |  |  | 		$user = User::staticGet('jabber', jabber_normalize_jid($from)); | 
					
						
							|  |  |  | 		return $user; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function get_confirmation($from) { | 
					
						
							|  |  |  | 		$confirm = new Confirm_address(); | 
					
						
							|  |  |  | 		$confirm->address = $from; | 
					
						
							|  |  |  | 		$confirm->address_type = 'jabber'; | 
					
						
							|  |  |  | 		if ($confirm->find(TRUE)) { | 
					
						
							|  |  |  | 			return $confirm; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			return NULL; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function handle_message(&$pl) { | 
					
						
							| 
									
										
										
										
											2008-06-23 18:36:41 -04:00
										 |  |  | 		if ($pl['type'] != 'chat') { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (strlen($pl['body']) == 0) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-26 16:39:35 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$from = jabber_normalize_jid($pl['from']); | 
					
						
							|  |  |  | 		$user = $this->get_user($from); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 		if (!$user) { | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 			$this->from_site($from, 'Unknown user; go to ' . | 
					
						
							| 
									
										
										
										
											2008-07-04 16:17:16 -04:00
										 |  |  | 							 common_local_url('imsettings') . | 
					
						
							|  |  |  | 							 ' to add your address to your account'); | 
					
						
							| 
									
										
										
										
											2008-06-23 00:18:16 -04:00
										 |  |  | 			$this->log(LOG_WARNING, 'Message from unknown user ' . $from); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if ($this->handle_command($user, $pl['body'])) { | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$this->add_notice($user, $pl); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-04 16:17:16 -04:00
										 |  |  | 	function from_site($address, $msg) { | 
					
						
							|  |  |  | 		$text = '['.common_config('site', 'name') . '] ' . $msg; | 
					
						
							|  |  |  | 		jabber_send_message($address, $text); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function handle_command($user, $body) { | 
					
						
							|  |  |  | 		# XXX: localise
 | 
					
						
							|  |  |  | 		switch(trim($body)) { | 
					
						
							|  |  |  | 		 case 'on': | 
					
						
							|  |  |  | 			$this->set_notify($user, true); | 
					
						
							| 
									
										
										
										
											2008-07-04 16:17:16 -04:00
										 |  |  | 			$this->from_site($user->jabber, 'notifications on'); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		 case 'off': | 
					
						
							|  |  |  | 			$this->set_notify($user, false); | 
					
						
							| 
									
										
										
										
											2008-07-04 16:17:16 -04:00
										 |  |  | 			$this->from_site($user->jabber, 'notifications off'); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 			return true; | 
					
						
							|  |  |  | 		 default: | 
					
						
							|  |  |  | 			return false; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 22:38:59 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	function set_notify(&$user, $notify) { | 
					
						
							|  |  |  | 		$orig = clone($user); | 
					
						
							|  |  |  | 		$user->jabbernotify = $notify; | 
					
						
							|  |  |  | 		$result = $user->update($orig); | 
					
						
							|  |  |  | 		if (!$id) { | 
					
						
							|  |  |  | 			$last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 			$this->log(LOG_ERROR, | 
					
						
							| 
									
										
										
										
											2008-06-22 22:38:59 -04:00
										 |  |  | 					   'Could not set notify flag to ' . $notify . | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 					   ' for user ' . common_log_objstring($user) . | 
					
						
							| 
									
										
										
										
											2008-06-22 22:38:59 -04:00
										 |  |  | 					   ': ' . $last_error->message); | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			$this->log(LOG_INFO, | 
					
						
							|  |  |  | 					   'User ' . $user->nickname . ' set notify flag to ' . $notify); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function add_notice(&$user, &$pl) { | 
					
						
							|  |  |  | 		$notice = new Notice(); | 
					
						
							|  |  |  | 		$notice->profile_id = $user->id; | 
					
						
							|  |  |  | 		$notice->content = trim(substr($pl['body'], 0, 140)); | 
					
						
							|  |  |  | 		$notice->created = DB_DataObject_Cast::dateTime(); | 
					
						
							|  |  |  | 		$notice->query('BEGIN'); | 
					
						
							|  |  |  | 		$id = $notice->insert(); | 
					
						
							|  |  |  | 		if (!$id) { | 
					
						
							|  |  |  | 			$last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 			$this->log(LOG_ERROR, | 
					
						
							|  |  |  | 					   'Could not insert ' . common_log_objstring($notice) . | 
					
						
							|  |  |  | 					   ' for user ' . common_log_objstring($user) . | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 					   ': ' . $last_error->message); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$orig = clone($notice); | 
					
						
							|  |  |  | 		$notice->uri = common_notice_uri($notice); | 
					
						
							|  |  |  | 		$result = $notice->update($orig); | 
					
						
							|  |  |  | 		if (!$result) { | 
					
						
							|  |  |  | 			$last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 			$this->log(LOG_ERROR, | 
					
						
							|  |  |  | 					   'Could not add URI to ' . common_log_objstring($notice) . | 
					
						
							|  |  |  | 					   ' for user ' . common_log_objstring($user) . | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 					   ': ' . $last_error->message); | 
					
						
							|  |  |  | 			return; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2008-06-26 03:12:13 -04:00
										 |  |  | 		$notice->query('COMMIT'); | 
					
						
							| 
									
										
										
										
											2008-07-04 03:29:09 -04:00
										 |  |  | 		common_real_broadcast($notice); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:38:59 -04:00
										 |  |  | 		$this->log(LOG_INFO, | 
					
						
							|  |  |  | 				   'Added notice ' . $notice->id . ' from user ' . $user->nickname); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function handle_presence(&$pl) { | 
					
						
							| 
									
										
										
										
											2008-06-23 20:15:23 -04:00
										 |  |  | 		$from = jabber_normalize_jid($pl['from']); | 
					
						
							| 
									
										
										
										
											2008-06-26 02:46:46 -04:00
										 |  |  | 		switch ($pl['type']) { | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 		 case 'subscribe': | 
					
						
							|  |  |  | 			# We let anyone subscribe
 | 
					
						
							|  |  |  | 			$this->subscribed($from); | 
					
						
							|  |  |  | 			$this->log(LOG_INFO, | 
					
						
							|  |  |  | 					   'Accepted subscription from ' . $from); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		 case 'subscribed': | 
					
						
							|  |  |  | 		 case 'unsubscribed': | 
					
						
							|  |  |  | 		 case 'unsubscribe': | 
					
						
							|  |  |  | 			$this->log(LOG_INFO, | 
					
						
							|  |  |  | 					   'Ignoring  "' . $pl['type'] . '" from ' . $from); | 
					
						
							|  |  |  | 			break; | 
					
						
							|  |  |  | 		 default: | 
					
						
							|  |  |  | 			if (!$pl['type']) { | 
					
						
							|  |  |  | 				$user = User::staticGet('jabber', $from); | 
					
						
							|  |  |  | 				if (!$user) { | 
					
						
							|  |  |  | 					$this->log(LOG_WARNING, 'Message from unknown user ' . $from); | 
					
						
							|  |  |  | 					return; | 
					
						
							| 
									
										
										
										
											2008-06-26 02:46:46 -04:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 				if ($user->updatefrompresence) { | 
					
						
							|  |  |  | 					$this->log(LOG_INFO, 'Updating ' . $user->nickname . | 
					
						
							|  |  |  | 							   ' status from presence.'); | 
					
						
							|  |  |  | 					$this->add_notice($user, $pl); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			break; | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-22 23:02:59 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 	function log($level, $msg) { | 
					
						
							|  |  |  | 		common_log($level, 'XMPPDaemon('.$this->resource.'): '.$msg); | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-06-26 02:46:46 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	function subscribed($to) { | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 		jabber_special_presence('subscribed', $to); | 
					
						
							| 
									
										
										
										
											2008-06-26 02:46:46 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 	function set_status($status) { | 
					
						
							| 
									
										
										
										
											2008-06-26 11:12:02 -04:00
										 |  |  | 		$this->log(LOG_INFO, 'Setting status to "' . $status . '"'); | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 		jabber_send_presence($status); | 
					
						
							| 
									
										
										
										
											2008-06-26 02:46:46 -04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	function top_queue_item() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$qi = new Queue_item(); | 
					
						
							|  |  |  | 		$qi->orderBy('created'); | 
					
						
							|  |  |  | 		$qi->whereAdd('claimed is NULL'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$qi->limit(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$cnt = $qi->find(TRUE); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		if ($cnt) { | 
					
						
							|  |  |  | 			# XXX: potential race condition
 | 
					
						
							|  |  |  | 			# can we force it to only update if claimed is still NULL
 | 
					
						
							|  |  |  | 			# (or old)?
 | 
					
						
							|  |  |  | 			$this->log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id); | 
					
						
							|  |  |  | 			$orig = clone($qi); | 
					
						
							|  |  |  | 			$qi->claimed = DB_DataObject_Cast::dateTime(); | 
					
						
							|  |  |  | 			$result = $qi->update($orig); | 
					
						
							|  |  |  | 			if ($result) { | 
					
						
							|  |  |  | 				$this->log(LOG_INFO, 'claim succeeded.'); | 
					
						
							|  |  |  | 				return $qi; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$this->log(LOG_INFO, 'claim failed.'); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		$qi = NULL; | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function broadcast_queue() { | 
					
						
							|  |  |  | 		$this->clear_old_claims(); | 
					
						
							|  |  |  | 		$this->log(LOG_INFO, 'checking for queued notices'); | 
					
						
							|  |  |  | 		do { | 
					
						
							|  |  |  | 			$qi = $this->top_queue_item(); | 
					
						
							|  |  |  | 			if ($qi) { | 
					
						
							| 
									
										
										
										
											2008-07-05 14:39:55 -04:00
										 |  |  | 				$this->log(LOG_INFO, 'Got item enqueued '.common_exact_date($qi->created)); | 
					
						
							| 
									
										
										
										
											2008-07-05 13:28:37 -04:00
										 |  |  | 				$notice = Notice::staticGet($qi->notice_id); | 
					
						
							|  |  |  | 				if ($notice) { | 
					
						
							|  |  |  | 					$this->log(LOG_INFO, 'broadcasting notice ID = ' . $notice->id); | 
					
						
							|  |  |  | 					# XXX: what to do if broadcast fails?
 | 
					
						
							|  |  |  | 					$result = common_real_broadcast($notice, $this->is_remote($notice)); | 
					
						
							|  |  |  | 					if (!$result) { | 
					
						
							|  |  |  | 						$this->log(LOG_WARNING, 'Failed broadcast for notice ID = ' . $notice->id); | 
					
						
							|  |  |  | 						$orig = $qi; | 
					
						
							|  |  |  | 						$qi->claimed = NULL; | 
					
						
							|  |  |  | 						$qi->update($orig); | 
					
						
							|  |  |  | 						$this->log(LOG_WARNING, 'Abandoned claim for notice ID = ' . $notice->id); | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					$this->log(LOG_INFO, 'finished broadcasting notice ID = ' . $notice->id); | 
					
						
							|  |  |  | 					$notice = NULL; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					$this->log(LOG_WARNING, 'queue item for notice that does not exist'); | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$qi->delete(); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} while ($qi); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function clear_old_claims() { | 
					
						
							|  |  |  | 		$qi = new Queue_item(); | 
					
						
							|  |  |  | 		$qi->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); | 
					
						
							|  |  |  | 		$qi->update(DB_DATAOBJECT_WHEREADD_ONLY); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	function is_remote($notice) { | 
					
						
							|  |  |  | 		$user = User::staticGet($notice->profile_id); | 
					
						
							|  |  |  | 		return !$user; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2008-07-05 23:57:07 -04:00
										 |  |  | 	 | 
					
						
							|  |  |  | 	function confirmation_queue() { | 
					
						
							| 
									
										
										
										
											2008-07-06 02:14:37 -04:00
										 |  |  | 	    # $this->clear_old_confirm_claims();
 | 
					
						
							| 
									
										
										
										
											2008-07-05 23:57:07 -04:00
										 |  |  | 		$this->log(LOG_INFO, 'checking for queued confirmations'); | 
					
						
							|  |  |  | 		do { | 
					
						
							|  |  |  | 			$confirm = $this->next_confirm(); | 
					
						
							|  |  |  | 			if ($confirm) { | 
					
						
							|  |  |  | 				$this->log(LOG_INFO, 'Sending confirmation for ' . $confirm->address); | 
					
						
							|  |  |  | 				$user = User::staticGet($confirm->user_id); | 
					
						
							|  |  |  | 				if (!$user) { | 
					
						
							|  |  |  | 					$this->log(LOG_WARNING, 'Confirmation for unknown user ' . $confirm->user_id); | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				$success = jabber_confirm_address($confirm->code, | 
					
						
							| 
									
										
										
										
											2008-07-06 02:14:37 -04:00
										 |  |  | 								  $user->nickname, | 
					
						
							|  |  |  | 								  $confirm->address); | 
					
						
							| 
									
										
										
										
											2008-07-05 23:57:07 -04:00
										 |  |  | 				if (!$success) { | 
					
						
							|  |  |  | 					$this->log(LOG_ERROR, 'Confirmation failed for ' . $confirm->address); | 
					
						
							|  |  |  | 					# Just let the claim age out; hopefully things work then
 | 
					
						
							|  |  |  | 					continue; | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					$this->log(LOG_INFO, 'Confirmation sent for ' . $confirm->address); | 
					
						
							|  |  |  | 					# Mark confirmation sent
 | 
					
						
							|  |  |  | 					$original = clone($confirm); | 
					
						
							|  |  |  | 					$confirm->sent = DB_DataObject_Cast::dateTime(); | 
					
						
							|  |  |  | 					$result = $confirm->update($original); | 
					
						
							|  |  |  | 					if (!$result) { | 
					
						
							|  |  |  | 						$this->log(LOG_ERROR, 'Cannot mark sent for ' . $confirm->address); | 
					
						
							|  |  |  | 						# Just let the claim age out; hopefully things work then
 | 
					
						
							|  |  |  | 						continue; | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} while ($confirm); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	function next_confirm() { | 
					
						
							|  |  |  | 		$confirm = new Confirm_address(); | 
					
						
							| 
									
										
										
										
											2008-07-06 02:14:37 -04:00
										 |  |  | 		$confirm->whereAdd('claimed IS NULL'); | 
					
						
							| 
									
										
										
										
											2008-07-05 23:58:38 -04:00
										 |  |  | 		# XXX: eventually we could do other confirmations in the queue, too
 | 
					
						
							|  |  |  | 		$confirm->address_type = 'jabber'; | 
					
						
							| 
									
										
										
										
											2008-07-05 23:57:07 -04:00
										 |  |  | 		$confirm->orderBy('modified DESC'); | 
					
						
							|  |  |  | 		$confirm->limit(1); | 
					
						
							|  |  |  | 		if ($confirm->find(TRUE)) { | 
					
						
							|  |  |  | 			$this->log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address); | 
					
						
							|  |  |  | 			$original = clone($confirm); | 
					
						
							|  |  |  | 			$confirm->claimed = DB_DataObject_Cast::dateTime(); | 
					
						
							|  |  |  | 			$result = $confirm->update($original); | 
					
						
							|  |  |  | 			if ($result) { | 
					
						
							|  |  |  | 				$this->log(LOG_INFO, 'Succeeded in claim!'); | 
					
						
							|  |  |  | 				return $confirm; | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$this->log(LOG_INFO, 'Failed in claim!'); | 
					
						
							|  |  |  | 				return false; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return NULL; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	function clear_old_confirm_claims() { | 
					
						
							|  |  |  | 		$confirm = new Confirm(); | 
					
						
							|  |  |  | 		$confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT); | 
					
						
							|  |  |  | 		$confirm->update(DB_DATAOBJECT_WHEREADD_ONLY); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | $resource = ($argc > 1) ? $argv[1] : NULL; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | $daemon = new XMPPDaemon($resource); | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 23:01:50 -04:00
										 |  |  | if ($daemon->connect()) { | 
					
						
							| 
									
										
										
										
											2008-06-26 11:03:36 -04:00
										 |  |  | 	$daemon->set_status("Send me a message to post a notice"); | 
					
						
							| 
									
										
										
										
											2008-06-22 23:01:50 -04:00
										 |  |  | 	$daemon->handle(); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2008-06-26 11:12:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-06-22 22:27:10 -04:00
										 |  |  | ?>
 |