summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--EVENTS.txt32
-rw-r--r--actions/joingroup.php16
-rw-r--r--actions/leavegroup.php21
-rw-r--r--classes/Group_member.php37
-rw-r--r--lib/command.php45
-rw-r--r--lib/subs.php88
6 files changed, 153 insertions, 86 deletions
diff --git a/EVENTS.txt b/EVENTS.txt
index 64e345b69..e6400244e 100644
--- a/EVENTS.txt
+++ b/EVENTS.txt
@@ -655,3 +655,35 @@ StartUnblockProfile: when we're about to unblock
EndUnblockProfile: when an unblock has succeeded
- $user: the person doing the unblock
- $profile: the person unblocked, can be remote
+
+StartSubscribe: when a subscription is starting
+- $user: the person subscribing
+- $other: the person being subscribed to
+
+EndSubscribe: when a subscription is finished
+- $user: the person subscribing
+- $other: the person being subscribed to
+
+StartUnsubscribe: when an unsubscribe is starting
+- $user: the person unsubscribing
+- $other: the person being unsubscribed from
+
+EndUnsubscribe: when an unsubscribe is done
+- $user: the person unsubscribing
+- $other: the person being unsubscribed to
+
+StartJoinGroup: when a user is joining a group
+- $group: the group being joined
+- $user: the user joining
+
+EndJoinGroup: when a user finishes joining a group
+- $group: the group being joined
+- $user: the user joining
+
+StartLeaveGroup: when a user is leaving a group
+- $group: the group being left
+- $user: the user leaving
+
+EndLeaveGroup: when a user has left a group
+- $group: the group being left
+- $user: the user leaving
diff --git a/actions/joingroup.php b/actions/joingroup.php
index 05e33e7cb..235e5ab4c 100644
--- a/actions/joingroup.php
+++ b/actions/joingroup.php
@@ -115,16 +115,12 @@ class JoingroupAction extends Action
$cur = common_current_user();
- $member = new Group_member();
-
- $member->group_id = $this->group->id;
- $member->profile_id = $cur->id;
- $member->created = common_sql_now();
-
- $result = $member->insert();
-
- if (!$result) {
- common_log_db_error($member, 'INSERT', __FILE__);
+ try {
+ if (Event::handle('StartJoinGroup', array($this->group, $cur))) {
+ Group_member::join($this->group->id, $cur->id);
+ Event::handle('EndJoinGroup', array($this->group, $cur));
+ }
+ } catch (Exception $e) {
$this->serverError(sprintf(_('Could not join user %1$s to group %2$s.'),
$cur->nickname, $this->group->nickname));
}
diff --git a/actions/leavegroup.php b/actions/leavegroup.php
index b0f973e1a..9b9d83b6c 100644
--- a/actions/leavegroup.php
+++ b/actions/leavegroup.php
@@ -110,22 +110,15 @@ class LeavegroupAction extends Action
$cur = common_current_user();
- $member = new Group_member();
-
- $member->group_id = $this->group->id;
- $member->profile_id = $cur->id;
-
- if (!$member->find(true)) {
- $this->serverError(_('Could not find membership record.'));
- return;
- }
-
- $result = $member->delete();
-
- if (!$result) {
- common_log_db_error($member, 'DELETE', __FILE__);
+ try {
+ if (Event::handle('StartLeaveGroup', array($this->group, $cur))) {
+ Group_member::leave($this->group->id, $cur->id);
+ Event::handle('EndLeaveGroup', array($this->group, $cur));
+ }
+ } catch (Exception $e) {
$this->serverError(sprintf(_('Could not remove user %1$s from group %2$s.'),
$cur->nickname, $this->group->nickname));
+ return;
}
if ($this->boolean('ajax')) {
diff --git a/classes/Group_member.php b/classes/Group_member.php
index 069b2c7a1..7b1760f76 100644
--- a/classes/Group_member.php
+++ b/classes/Group_member.php
@@ -25,4 +25,41 @@ class Group_member extends Memcached_DataObject
{
return Memcached_DataObject::pkeyGet('Group_member', $kv);
}
+
+ static function join($group_id, $profile_id)
+ {
+ $member = new Group_member();
+
+ $member->group_id = $group_id;
+ $member->profile_id = $profile_id;
+ $member->created = common_sql_now();
+
+ $result = $member->insert();
+
+ if (!$result) {
+ common_log_db_error($member, 'INSERT', __FILE__);
+ throw new Exception(_("Group join failed."));
+ }
+
+ return true;
+ }
+
+ static function leave($group_id, $profile_id)
+ {
+ $member = Group_member::pkeyGet(array('group_id' => $group_id,
+ 'profile_id' => $profile_id));
+
+ if (empty($member)) {
+ throw new Exception(_("Not part of group."));
+ }
+
+ $result = $member->delete();
+
+ if (!$result) {
+ common_log_db_error($member, 'INSERT', __FILE__);
+ throw new Exception(_("Group leave failed."));
+ }
+
+ return true;
+ }
}
diff --git a/lib/command.php b/lib/command.php
index f846fb823..c0a32e1b1 100644
--- a/lib/command.php
+++ b/lib/command.php
@@ -222,18 +222,15 @@ class JoinCommand extends Command
return;
}
- $member = new Group_member();
-
- $member->group_id = $group->id;
- $member->profile_id = $cur->id;
- $member->created = common_sql_now();
-
- $result = $member->insert();
- if (!$result) {
- common_log_db_error($member, 'INSERT', __FILE__);
- $channel->error($cur, sprintf(_('Could not join user %s to group %s'),
- $cur->nickname, $group->nickname));
- return;
+ try {
+ if (Event::handle('StartJoinGroup', array($group, $cur))) {
+ Group_member::join($group->id, $cur->id);
+ Event::handle('EndJoinGroup', array($group, $cur));
+ }
+ } catch (Exception $e) {
+ $channel->error($cur, sprintf(_('Could not join user %s to group %s'),
+ $cur->nickname, $group->nickname));
+ return;
}
$channel->output($cur, sprintf(_('%s joined group %s'),
@@ -269,21 +266,15 @@ class DropCommand extends Command
return;
}
- $member = new Group_member();
-
- $member->group_id = $group->id;
- $member->profile_id = $cur->id;
-
- if (!$member->find(true)) {
- $channel->error($cur,_('Could not find membership record.'));
- return;
- }
- $result = $member->delete();
- if (!$result) {
- common_log_db_error($member, 'INSERT', __FILE__);
- $channel->error($cur, sprintf(_('Could not remove user %s to group %s'),
- $cur->nickname, $group->nickname));
- return;
+ try {
+ if (Event::handle('StartLeaveGroup', array($group, $cur))) {
+ Group_member::leave($group->id, $cur->id);
+ Event::handle('EndLeaveGroup', array($group, $cur));
+ }
+ } catch (Exception $e) {
+ $channel->error($cur, sprintf(_('Could not remove user %s to group %s'),
+ $cur->nickname, $group->nickname));
+ return;
}
$channel->output($cur, sprintf(_('%s left group %s'),
diff --git a/lib/subs.php b/lib/subs.php
index 4b6b03967..5ac1a75a5 100644
--- a/lib/subs.php
+++ b/lib/subs.php
@@ -56,35 +56,44 @@ function subs_subscribe_to($user, $other)
return _('User has blocked you.');
}
- if (!$user->subscribeTo($other)) {
- return _('Could not subscribe.');
- return;
- }
+ try {
+ if (Event::handle('StartSubscribe', array($user, $other))) {
- subs_notify($other, $user);
+ if (!$user->subscribeTo($other)) {
+ return _('Could not subscribe.');
+ return;
+ }
- $cache = common_memcache();
+ subs_notify($other, $user);
- if ($cache) {
- $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
- }
+ $cache = common_memcache();
- $profile = $user->getProfile();
+ if ($cache) {
+ $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+ }
- $profile->blowSubscriptionsCount();
- $other->blowSubscribersCount();
+ $profile = $user->getProfile();
- if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
- if (!$other->subscribeTo($user)) {
- return _('Could not subscribe other to you.');
- }
- $cache = common_memcache();
+ $profile->blowSubscriptionsCount();
+ $other->blowSubscribersCount();
+
+ if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) {
+ if (!$other->subscribeTo($user)) {
+ return _('Could not subscribe other to you.');
+ }
+ $cache = common_memcache();
- if ($cache) {
- $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
- }
+ if ($cache) {
+ $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id));
+ }
- subs_notify($user, $other);
+ subs_notify($user, $other);
+ }
+
+ Event::handle('EndSubscribe', array($user, $other));
+ }
+ } catch (Exception $e) {
+ return $e->getMessage();
}
return true;
@@ -133,28 +142,37 @@ function subs_unsubscribe_to($user, $other)
return _('Couldn\'t delete self-subscription.');
}
- $sub = DB_DataObject::factory('subscription');
+ try {
+ if (Event::handle('StartUnsubscribe', array($user, $other))) {
- $sub->subscriber = $user->id;
- $sub->subscribed = $other->id;
+ $sub = DB_DataObject::factory('subscription');
- $sub->find(true);
+ $sub->subscriber = $user->id;
+ $sub->subscribed = $other->id;
- // note we checked for existence above
+ $sub->find(true);
- if (!$sub->delete())
- return _('Couldn\'t delete subscription.');
+ // note we checked for existence above
- $cache = common_memcache();
+ if (!$sub->delete())
+ return _('Couldn\'t delete subscription.');
- if ($cache) {
- $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
- }
+ $cache = common_memcache();
- $profile = $user->getProfile();
+ if ($cache) {
+ $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
+ }
- $profile->blowSubscriptionsCount();
- $other->blowSubscribersCount();
+ $profile = $user->getProfile();
+
+ $profile->blowSubscriptionsCount();
+ $other->blowSubscribersCount();
+
+ Event::handle('EndUnsubscribe', array($user, $other));
+ }
+ } catch (Exception $e) {
+ return $e->getMessage();
+ }
return true;
}