]> git.mxchange.org Git - friendica.git/blob - include/group.php
Some more changed calls
[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                 dba::delete('group_member', array('uid' => $uid, 'pid' => $group_id));
83
84                 // remove group
85                 $r = q("UPDATE `group` SET `deleted` = 1 WHERE `uid` = %d AND `name` = '%s'",
86                         intval($uid),
87                         dbesc($name)
88                 );
89
90                 $ret = $r;
91
92         }
93
94         return $ret;
95 }
96
97 function group_byname($uid,$name) {
98         if ((! $uid) || (! strlen($name)))
99                 return false;
100         $r = q("SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' LIMIT 1",
101                 intval($uid),
102                 dbesc($name)
103         );
104         if (DBM::is_result($r))
105                 return $r[0]['id'];
106         return false;
107 }
108
109 function group_rmv_member($uid, $name, $member) {
110         $gid = group_byname($uid, $name);
111
112         if (!$gid) {
113                 return false;
114         }
115
116         if (!($uid && $gid && $member)) {
117                 return false;
118         }
119
120         $r = dba::delete('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member));
121         return $r;
122 }
123
124
125 function group_add_member($uid,$name,$member,$gid = 0) {
126         if (! $gid)
127                 $gid = group_byname($uid,$name);
128         if ((! $gid) || (! $uid) || (! $member))
129                 return false;
130
131         $r = q("SELECT * FROM `group_member` WHERE `uid` = %d AND `gid` = %d AND `contact-id` = %d LIMIT 1",
132                 intval($uid),
133                 intval($gid),
134                 intval($member)
135         );
136         if (DBM::is_result($r))
137                 return true;    // You might question this, but
138                                 // we indicate success because the group member was in fact created
139                                 // -- It was just created at another time
140         if (! DBM::is_result($r)) {
141                 $r = dba::insert('group_member', array('uid' => $uid, 'gid' => $gid, 'contact-id' => $member));
142         }
143         return $r;
144 }
145
146 function group_get_members($gid) {
147         $ret = array();
148         if (intval($gid)) {
149                 $r = q("SELECT `group_member`.`contact-id`, `contact`.* FROM `group_member`
150                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
151                         WHERE `gid` = %d AND `group_member`.`uid` = %d AND
152                                 NOT `contact`.`self` AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
153                                 ORDER BY `contact`.`name` ASC ",
154                         intval($gid),
155                         intval(local_user())
156                 );
157                 if (DBM::is_result($r))
158                         $ret = $r;
159         }
160         return $ret;
161 }
162
163 function group_public_members($gid) {
164         $ret = 0;
165         if (intval($gid)) {
166                 $r = q("SELECT `contact`.`id` AS `contact-id` FROM `group_member`
167                         INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
168                         WHERE `gid` = %d AND `group_member`.`uid` = %d
169                         AND  `contact`.`network` = '%s' AND `contact`.`notify` != '' ",
170                         intval($gid),
171                         intval(local_user()),
172                         dbesc(NETWORK_OSTATUS)
173                 );
174                 if (DBM::is_result($r))
175                         $ret = count($r);
176         }
177         return $ret;
178 }
179
180
181 function mini_group_select($uid,$gid = 0, $label = "") {
182
183         $grps = array();
184         $o = '';
185
186         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
187                 intval($uid)
188         );
189         $grps[] = array('name' => '', 'id' => '0', 'selected' => '');
190         if (DBM::is_result($r)) {
191                 foreach ($r as $rr) {
192                         $grps[] = array('name' => $rr['name'], 'id' => $rr['id'], 'selected' => (($gid == $rr['id']) ? 'true' : ''));
193                 }
194
195         }
196         logger('groups: ' . print_r($grps,true));
197
198         if ($label == "")
199                 $label = t('Default privacy group for new contacts');
200
201         $o = replace_macros(get_markup_template('group_selection.tpl'), array(
202                 '$label' => $label,
203                 '$groups' => $grps
204         ));
205         return $o;
206 }
207
208
209 /**
210  * @brief Create group sidebar widget
211  *
212  * @param string $every
213  * @param string $each
214  * @param string $editmode
215  *      'standard' => include link 'Edit groups'
216  *      'extended' => include link 'Create new group'
217  *      'full' => include link 'Create new group' and provide for each group a link to edit this group
218  * @param int $group_id
219  * @param int $cid
220  * @return string
221  */
222 function group_side($every="contacts",$each="group",$editmode = "standard", $group_id = 0, $cid = 0) {
223
224         $o = '';
225
226         if (! local_user())
227                 return '';
228
229         $groups = array();
230
231         $groups[] = array(
232                 'text'  => t('Everybody'),
233                 'id' => 0,
234                 'selected' => (($group_id == 0) ? 'group-selected' : ''),
235                 'href'  => $every,
236         );
237
238
239
240         $r = q("SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d ORDER BY `name` ASC",
241                 intval($_SESSION['uid'])
242         );
243         $member_of = array();
244         if ($cid) {
245                 $member_of = groups_containing(local_user(),$cid);
246         }
247
248         if (DBM::is_result($r)) {
249                 foreach ($r as $rr) {
250                         $selected = (($group_id == $rr['id']) ? ' group-selected' : '');
251
252                         if ($editmode == "full") {
253                                 $groupedit = array(
254                                         'href' => "group/".$rr['id'],
255                                         'title' => t('edit'),
256                                 );
257                         } else {
258                                 $groupedit = null;
259                         }
260
261                         $groups[] = array(
262                                 'id'            => $rr['id'],
263                                 'cid'           => $cid,
264                                 'text'          => $rr['name'],
265                                 'selected'      => $selected,
266                                 'href'          => $each."/".$rr['id'],
267                                 'edit'          => $groupedit,
268                                 'ismember'      => in_array($rr['id'],$member_of),
269                         );
270                 }
271         }
272
273
274         $tpl = get_markup_template("group_side.tpl");
275         $o = replace_macros($tpl, array(
276                 '$title'        => t('Groups'),
277                 'newgroup'      => (($editmode == "extended") || ($editmode == "full") ? 1 : ''),
278                 '$editgroupstext' => t('Edit groups'),
279                 'grouppage'     => "group/",
280                 '$edittext'     => t('Edit group'),
281                 '$createtext'   => t('Create a new group'),
282                 '$creategroup'  => t('Group Name: '),
283                 '$form_security_token' => get_form_security_token("group_edit"),
284                 '$ungrouped'    => (($every === 'contacts') ? t('Contacts not in any group') : ''),
285                 '$groups'       => $groups,
286                 '$add'          => t('add'),
287         ));
288
289
290         return $o;
291 }
292
293 function expand_groups($a,$check_dead = false, $use_gcontact = false) {
294         if (! (is_array($a) && count($a)))
295                 return array();
296         $groups = implode(',', $a);
297         $groups = dbesc($groups);
298
299         if ($use_gcontact)
300                 $r = q("SELECT `gcontact`.`id` AS `contact-id` FROM `group_member`
301                                 INNER JOIN `contact` ON `contact`.`id` = `group_member`.`contact-id`
302                                 INNER JOIN `gcontact` ON `gcontact`.`nurl` = `contact`.`nurl`
303                         WHERE `gid` IN ($groups)");
304         else
305                 $r = q("SELECT `contact-id` FROM `group_member` WHERE `gid` IN ( $groups )");
306
307
308         $ret = array();
309         if (DBM::is_result($r))
310                 foreach ($r as $rr)
311                         $ret[] = $rr['contact-id'];
312         if ($check_dead && !$use_gcontact) {
313                 require_once('include/acl_selectors.php');
314                 $ret = prune_deadguys($ret);
315         }
316         return $ret;
317 }
318
319
320 function member_of($c) {
321
322         $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 ",
323                 intval($c)
324         );
325
326         return $r;
327
328 }
329
330 function groups_containing($uid,$c) {
331
332         $r = q("SELECT `gid` FROM `group_member` WHERE `uid` = %d AND `group_member`.`contact-id` = %d ",
333                 intval($uid),
334                 intval($c)
335         );
336
337         $ret = array();
338         if (DBM::is_result($r)) {
339                 foreach ($r as $rr) {
340                         $ret[] = $rr['gid'];
341                 }
342         }
343
344         return $ret;
345 }
346 /**
347  * @brief count unread group items
348  *
349  * Count unread items of each groups
350  *
351  * @return array
352  *      'id' => group id
353  *      'name' => group name
354  *      'count' => counted unseen group items
355  *
356  */
357 function groups_count_unseen() {
358
359         $r = q("SELECT `group`.`id`, `group`.`name`,
360                         (SELECT COUNT(*) FROM `item` FORCE INDEX (`uid_unseen_contactid`)
361                                 WHERE `uid` = %d AND `unseen` AND
362                                         `contact-id` IN (SELECT `contact-id` FROM `group_member`
363                                                                 WHERE `group_member`.`gid` = `group`.`id` AND `group_member`.`uid` = %d)) AS `count`
364                         FROM `group` WHERE `group`.`uid` = %d;",
365                 intval(local_user()),
366                 intval(local_user()),
367                 intval(local_user())
368         );
369
370         return $r;
371 }
372
373 /**
374  * @brief Returns the default group for a given user and network
375  *
376  * @param int $uid User id
377  * @param string $network network name
378  *
379  * @return int group id
380  */
381 function get_default_group($uid, $network = "") {
382
383         $default_group = 0;
384
385         if ($network == NETWORK_OSTATUS)
386                 $default_group = PConfig::get($uid, "ostatus", "default_group");
387
388         if ($default_group != 0)
389                 return $default_group;
390
391         $g = q("SELECT `def_gid` FROM `user` WHERE `uid` = %d LIMIT 1", intval($uid));
392         if ($g && intval($g[0]["def_gid"]))
393                 $default_group = $g[0]["def_gid"];
394
395         return $default_group;
396 }