]> git.mxchange.org Git - friendica.git/blob - include/group.php
Class file relocations
[friendica.git] / include / group.php
1 <?php
2
3 use Friendica\Core\PConfig;
4 use Friendica\Database\DBM;
5
6 function group_add($uid,$name) {
7
8         $ret = false;
9         if (x($uid) && x($name)) {
10                 $r = group_byname($uid,$name); // check for dups
11                 if ($r !== false) {
12
13                         // This could be a problem.
14                         // Let's assume we've just created a group which we once deleted
15                         // all the old members are gone, but the group remains so we don't break any security
16                         // access lists. What we're doing here is reviving the dead group, but old content which
17                         // was restricted to this group may now be seen by the new group members.
18
19                         $z = q("SELECT * FROM `group` WHERE `id` = %d LIMIT 1",
20                                 intval($r)
21                         );
22                         if (count($z) && $z[0]['deleted']) {
23                                 $r = q("UPDATE `group` SET `deleted` = 0 WHERE `uid` = %d AND `name` = '%s'",
24                                         intval($uid),
25                                         dbesc($name)
26                                 );
27                                 notice( t('A deleted group with this name was revived. Existing item permissions <strong>may</strong> apply to this group and any future members. If this is not what you intended, please create another group with a different name.') . EOL);
28                         }
29                         return true;
30                 }
31                 $r = dba::insert('group', array('uid' => $uid, 'name' => $name));
32                 $ret = $r;
33         }
34         return $ret;
35 }
36
37
38 function group_rmv($uid,$name) {
39         $ret = false;
40         if (x($uid) && x($name)) {
41                 $r = q("SELECT id FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
42                         intval($uid),
43                         dbesc($name)
44                 );
45                 if (DBM::is_result($r))
46                         $group_id = $r[0]['id'];
47                 if (! $group_id)
48                         return false;
49
50                 // remove group from default posting lists
51                 $r = q("SELECT def_gid, allow_gid, deny_gid FROM user WHERE uid = %d LIMIT 1",
52                        intval($uid)
53                 );
54                 if ($r) {
55                         $user_info = $r[0];
56                         $change = false;
57
58                         if ($user_info['def_gid'] == $group_id) {
59                                 $user_info['def_gid'] = 0;
60                                 $change = true;
61                         }
62                         if (strpos($user_info['allow_gid'], '<' . $group_id . '>') !== false) {
63                                 $user_info['allow_gid'] = str_replace('<' . $group_id . '>', '', $user_info['allow_gid']);
64                                 $change = true;
65                         }
66                         if (strpos($user_info['deny_gid'], '<' . $group_id . '>') !== false) {
67                                 $user_info['deny_gid'] = str_replace('<' . $group_id . '>', '', $user_info['deny_gid']);
68                                 $change = true;
69                         }
70
71                         if ($change) {
72                                 q("UPDATE user SET def_gid = %d, allow_gid = '%s', deny_gid = '%s' WHERE uid = %d",
73                                   intval($user_info['def_gid']),
74                                   dbesc($user_info['allow_gid']),
75                                   dbesc($user_info['deny_gid']),
76                                   intval($uid)
77                                 );
78                         }
79                 }
80
81                 // remove all members
82                 $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d ",
83                         intval($uid),
84                         intval($group_id)
85                 );
86
87                 // remove group
88                 $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s'",
89                         intval($uid),
90                         dbesc($name)
91                 );
92
93                 $ret = $r;
94
95         }
96
97         return $ret;
98 }
99
100 function group_byname($uid,$name) {
101         if ((! $uid) || (! strlen($name)))
102                 return false;
103         $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
104                 intval($uid),
105                 dbesc($name)
106         );
107         if (DBM::is_result($r))
108                 return $r[0]['id'];
109         return false;
110 }
111
112 function group_rmv_member($uid,$name,$member) {
113         $gid = group_byname($uid,$name);
114         if (! $gid)
115                 return false;
116         if (! ( $uid && $gid && $member))
117                 return false;
118         $r = q("DELETE FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d",
119                 intval($uid),
120                 intval($gid),
121                 intval($member)
122         );
123         return $r;
124
125
126 }
127
128
129 function group_add_member($uid,$name,$member,$gid = 0) {
130         if (! $gid)
131                 $gid = group_byname($uid,$name);
132         if ((! $gid) || (! $uid) || (! $member))
133                 return false;
134
135         $r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d LIMIT 1",
136                 intval($uid),
137                 intval($gid),
138                 intval($member)
139         );
140         if (DBM::is_result($r))
141                 return true;    // You might question this, but
142                                 // we indicate success because the group member was in fact created
143                                 // -- It was just created at another time
144         if (! DBM::is_result($r)) {
145                 $r = dba::insert('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member));
146         }
147         return $r;
148 }
149
150 function group_get_members($gid) {
151         $ret = array();
152         if (intval($gid)) {
153                 $r = q("SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
154                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
155                         WHERE `gid` = %d AND `group_member`.`uid` = %d AND
156                                 NOT `contact`.`self` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
157                                 ORDER BY `contact`.`name` ASC ",
158                         intval($gid),
159                         intval(local_user())
160                 );
161                 if (DBM::is_result($r))
162                         $ret = $r;
163         }
164         return $ret;
165 }
166
167 function group_public_members($gid) {
168         $ret = 0;
169         if (intval($gid)) {
170                 $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member`
171                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
172                         WHERE `gid` = %d AND `group_member`.`uid` = %d
173                         AND  `contact`.`network` = '%s' AND `contact`.`notify` != '' ",
174                         intval($gid),
175                         intval(local_user()),
176                         dbesc(NETWORK_OSTATUS)
177                 );
178                 if (DBM::is_result($r))
179                         $ret = count($r);
180         }
181         return $ret;
182 }
183
184
185 function mini_group_select($uid,$gid = 0, $label = "") {
186
187         $grps = array();
188         $o = '';
189
190         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
191                 intval($uid)
192         );
193         $grps[] = array('name' => '', 'id' => '0', 'selected' => '');
194         if (DBM::is_result($r)) {
195                 foreach ($r as $rr) {
196                         $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : ''));
197                 }
198
199         }
200         logger('groups: ' . print_r($grps,true));
201
202         if ($label == "")
203                 $label = t('Default privacy group for new contacts');
204
205         $o = replace_macros(get_markup_template('group_selection.tpl'), array(
206                 '$label' => $label,
207                 '$groups' => $grps
208         ));
209         return $o;
210 }
211
212
213 /**
214  * @brief Create group sidebar widget
215  *
216  * @param string $every
217  * @param string $each
218  * @param string $editmode
219  *      'standard' => include link 'Edit groups'
220  *      'extended' => include link 'Create new group'
221  *      'full' => include link 'Create new group' and provide for each group a link to edit this group
222  * @param int $group_id
223  * @param int $cid
224  * @return string
225  */
226 function group_side($every="contacts",$each="group",$editmode = "standard", $group_id = 0, $cid = 0) {
227
228         $o = '';
229
230         if (! local_user())
231                 return '';
232
233         $groups = array();
234
235         $groups[] = array(
236                 'text'  => t('Everybody'),
237                 'id' => 0,
238                 'selected' => (($group_id == 0) ? 'group-selected' : ''),
239                 'href'  => $every,
240         );
241
242
243
244         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
245                 intval($_SESSION['uid'])
246         );
247         $member_of = array();
248         if ($cid) {
249                 $member_of = groups_containing(local_user(),$cid);
250         }
251
252         if (DBM::is_result($r)) {
253                 foreach ($r as $rr) {
254                         $selected = (($group_id == $rr['id']) ? ' group-selected' : '');
255
256                         if ($editmode == "full") {
257                                 $groupedit = array(
258                                         'href' => "group/".$rr['id'],
259                                         'title' => t('edit'),
260                                 );
261                         } else {
262                                 $groupedit = null;
263                         }
264
265                         $groups[] = array(
266                                 'id'            => $rr['id'],
267                                 'cid'           => $cid,
268                                 'text'          => $rr['name'],
269                                 'selected'      => $selected,
270                                 'href'          => $each."/".$rr['id'],
271                                 'edit'          => $groupedit,
272                                 'ismember'      => in_array($rr['id'],$member_of),
273                         );
274                 }
275         }
276
277
278         $tpl = get_markup_template("group_side.tpl");
279         $o = replace_macros($tpl, array(
280                 '$title'        => t('Groups'),
281                 'newgroup'      => (($editmode == "extended") || ($editmode == "full") ? 1 : ''),
282                 '$editgroupstext' => t('Edit groups'),
283                 'grouppage'     => "group/",
284                 '$edittext'     => t('Edit group'),
285                 '$createtext'   => t('Create a new group'),
286                 '$creategroup'  => t('Group Name: '),
287                 '$form_security_token' => get_form_security_token("group_edit"),
288                 '$ungrouped'    => (($every === 'contacts') ? t('Contacts not in any group') : ''),
289                 '$groups'       => $groups,
290                 '$add'          => t('add'),
291         ));
292
293
294         return $o;
295 }
296
297 function expand_groups($a,$check_dead = false, $use_gcontact = false) {
298         if (! (is_array($a) && count($a)))
299                 return array();
300         $groups = implode(',', $a);
301         $groups = dbesc($groups);
302
303         if ($use_gcontact)
304                 $r = q("SELECT `gcontact`.`id` AS `contact-id` FROM `group_member`
305                                 INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
306                                 INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
307                         WHERE `gid` IN ($groups)");
308         else
309                 $r = q("SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups )");
310
311
312         $ret = array();
313         if (DBM::is_result($r))
314                 foreach ($r as $rr)
315                         $ret[] = $rr['contact-id'];
316         if ($check_dead && !$use_gcontact) {
317                 require_once('include/acl_selectors.php');
318                 $ret = prune_deadguys($ret);
319         }
320         return $ret;
321 }
322
323
324 function member_of($c) {
325
326         $r = q("SELECT `group`.`name`, `group`.`id` FROM `group` INNER JOIN `group_member` ON `group_member`.`gid` = `group`.`id` WHERE `group_member`.`contact-id` = %d AND `group`.`deleted` = 0 ORDER BY `group`.`name`  ASC ",
327                 intval($c)
328         );
329
330         return $r;
331
332 }
333
334 function groups_containing($uid,$c) {
335
336         $r = q("SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`contact-id` = %d ",
337                 intval($uid),
338                 intval($c)
339         );
340
341         $ret = array();
342         if (DBM::is_result($r)) {
343                 foreach ($r as $rr) {
344                         $ret[] = $rr['gid'];
345                 }
346         }
347
348         return $ret;
349 }
350 /**
351  * @brief count unread group items
352  *
353  * Count unread items of each groups
354  *
355  * @return array
356  *      'id' => group id
357  *      'name' => group name
358  *      'count' => counted unseen group items
359  *
360  */
361 function groups_count_unseen() {
362
363         $r = q("SELECT `group`.`id`, `group`.`name`,
364                         (SELECT COUNT(*) FROM `item` FORCE INDEX (`uid_unseen_contactid`)
365                                 WHERE `uid` = %d AND `unseen` AND
366                                         `contact-id` IN (SELECT `contact-id` FROM `group_member`
367                                                                 WHERE `group_member`.`gid` = `group`.`id` AND `group_member`.`uid` = %d)) AS `count`
368                         FROM `group` WHERE `group`.`uid` = %d;",
369                 intval(local_user()),
370                 intval(local_user()),
371                 intval(local_user())
372         );
373
374         return $r;
375 }
376
377 /**
378  * @brief Returns the default group for a given user and network
379  *
380  * @param int $uid User id
381  * @param string $network network name
382  *
383  * @return int group id
384  */
385 function get_default_group($uid, $network = "") {
386
387         $default_group = 0;
388
389         if ($network == NETWORK_OSTATUS)
390                 $default_group = PConfig::get($uid, "ostatus", "default_group");
391
392         if ($default_group != 0)
393                 return $default_group;
394
395         $g = q("SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid));
396         if ($g && intval($g[0]["def_gid"]))
397                 $default_group = $g[0]["def_gid"];
398
399         return $default_group;
400 }