| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | <?php | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  | /* | 
					
						
							| 
									
										
										
										
											2009-08-25 18:14:12 -04:00
										 |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							| 
									
										
										
										
											2009-08-25 18:12:20 -04:00
										 |  |  |  * Copyright (C) 2008, 2009, StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * 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. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * 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. | 
					
						
							| 
									
										
										
										
											2008-05-20 15:14:12 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  |  * 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/>. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-08-26 10:41:36 -04:00
										 |  |  | if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } | 
					
						
							| 
									
										
										
										
											2008-05-14 15:26:48 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | /** | 
					
						
							|  |  |  |  * Table Definition for subscription | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2008-09-26 12:18:24 -04:00
										 |  |  | require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | class Subscription extends Memcached_DataObject | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | { | 
					
						
							|  |  |  |     ###START_AUTOCODE
 | 
					
						
							|  |  |  |     /* the code below is auto generated do not remove the above tag */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public $__table = 'subscription';                    // table name
 | 
					
						
							|  |  |  |     public $subscriber;                      // int(4)  primary_key not_null
 | 
					
						
							|  |  |  |     public $subscribed;                      // int(4)  primary_key not_null
 | 
					
						
							| 
									
										
										
										
											2008-12-08 22:36:37 -05:00
										 |  |  |     public $jabber;                          // tinyint(1)   default_1
 | 
					
						
							|  |  |  |     public $sms;                             // tinyint(1)   default_1
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |     public $token;                           // varchar(255)
 | 
					
						
							|  |  |  |     public $secret;                          // varchar(255)
 | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  |     public $created;                         // datetime()   not_null
 | 
					
						
							|  |  |  |     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* Static get */ | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  |     function staticGet($k,$v=null) | 
					
						
							|  |  |  |     { return Memcached_DataObject::staticGet('Subscription',$k,$v); } | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* the code above is auto generated do not remove the tag below */ | 
					
						
							|  |  |  |     ###END_AUTOCODE
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-01-06 14:28:40 -08:00
										 |  |  |     function pkeyGet($kv) | 
					
						
							| 
									
										
										
										
											2008-12-23 14:33:23 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2008-12-23 14:19:07 -05:00
										 |  |  |         return Memcached_DataObject::pkeyGet('Subscription', $kv); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Make a new subscription | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Profile $subscriber party to receive new notices | 
					
						
							|  |  |  |      * @param Profile $other      party sending notices; publisher | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Subscription new subscription | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function start($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!$subscriber->hasRight(Right::SUBSCRIBE)) { | 
					
						
							|  |  |  |             throw new Exception(_('You have been banned from subscribing.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (self::exists($subscriber, $other)) { | 
					
						
							|  |  |  |             throw new Exception(_('Already subscribed!')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($other->hasBlocked($subscriber)) { | 
					
						
							|  |  |  |             throw new Exception(_('User has blocked you.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartSubscribe', array($subscriber, $other))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub = new Subscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub->subscriber = $subscriber->id; | 
					
						
							|  |  |  |             $sub->subscribed = $other->id; | 
					
						
							|  |  |  |             $sub->created    = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $result = $sub->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 common_log_db_error($sub, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                 throw new Exception(_('Could not save subscription.')); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub->notify(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self::blow('user:notices_with_friends:%d', $subscriber->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $subscriber->blowSubscriptionsCount(); | 
					
						
							|  |  |  |             $other->blowSubscribersCount(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $otherUser = User::staticGet('id', $other->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($otherUser) && | 
					
						
							|  |  |  |                 $otherUser->autosubscribe && | 
					
						
							|  |  |  |                 !self::exists($other, $subscriber) && | 
					
						
							|  |  |  |                 !$subscriber->hasBlocked($other)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $auto = new Subscription(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-17 12:14:19 -07:00
										 |  |  |                 $auto->subscriber = $other->id; | 
					
						
							|  |  |  |                 $auto->subscribed = $subscriber->id; | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |                 $auto->created    = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $result = $auto->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (!$result) { | 
					
						
							|  |  |  |                     common_log_db_error($auto, 'INSERT', __FILE__); | 
					
						
							|  |  |  |                     throw new Exception(_('Could not save subscription.')); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $auto->notify(); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndSubscribe', array($subscriber, $other)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function notify() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         # XXX: add other notifications (Jabber, SMS) here
 | 
					
						
							|  |  |  |         # XXX: queue this and handle it offline
 | 
					
						
							|  |  |  |         # XXX: Whatever happens, do it in Twitter-like API, too
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->notifyEmail(); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function notifyEmail() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $subscribedUser = User::staticGet('id', $this->subscribed); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($subscribedUser)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $subscriber = Profile::staticGet('id', $this->subscriber); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             mail_subscribe_notify_profile($subscribedUser, $subscriber); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Cancel a subscription | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function cancel($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!self::exists($subscriber, $other)) { | 
					
						
							|  |  |  |             throw new Exception(_('Not subscribed!')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Don't allow deleting self subs
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($subscriber->id == $other->id) { | 
					
						
							|  |  |  |             throw new Exception(_('Couldn\'t delete self-subscription.')); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (Event::handle('StartUnsubscribe', array($subscriber, $other))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, | 
					
						
							|  |  |  |                                                'subscribed' => $other->id)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // note we checked for existence above
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             assert(!empty($sub)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |             // @todo: move this block to EndSubscribe handler for
 | 
					
						
							|  |  |  |             // OMB plugin when it exists.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($sub->token)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $token = new Token(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $token->tok    = $sub->token; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if ($token->find(true)) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $result = $token->delete(); | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                     if (!$result) { | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  |                         common_log_db_error($token, 'DELETE', __FILE__); | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                         throw new Exception(_('Couldn\'t delete subscription OMB token.')); | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2010-03-01 14:30:28 -05:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     common_log(LOG_ERR, "Couldn't find credentials with token {$token->tok}"); | 
					
						
							| 
									
										
										
										
											2010-03-01 13:41:06 -05:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-19 08:16:45 -05:00
										 |  |  |             $result = $sub->delete(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 common_log_db_error($sub, 'DELETE', __FILE__); | 
					
						
							|  |  |  |                 throw new Exception(_('Couldn\'t delete subscription.')); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self::blow('user:notices_with_friends:%d', $subscriber->id); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $subscriber->blowSubscriptionsCount(); | 
					
						
							|  |  |  |             $other->blowSubscribersCount(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             Event::handle('EndUnsubscribe', array($subscriber, $other)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function exists($subscriber, $other) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $sub = Subscription::pkeyGet(array('subscriber' => $subscriber->id, | 
					
						
							|  |  |  |                                            'subscribed' => $other->id)); | 
					
						
							|  |  |  |         return (empty($sub)) ? false : true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2008-05-07 13:15:42 -04:00
										 |  |  | } |