]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - plugins/GroupPrivateMessage/Group_message.php
Fix URLs to reflect change in reCAPTCHA API
[quix0rs-gnu-social.git] / plugins / GroupPrivateMessage / Group_message.php
1 <?php
2 /**
3  * Data class for group direct messages
4  *
5  * PHP version 5
6  *
7  * @category Data
8  * @package  StatusNet
9  * @author   Evan Prodromou <evan@status.net>
10  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
11  * @link     http://status.net/
12  *
13  * StatusNet - the distributed open-source microblogging tool
14  * Copyright (C) 2009, StatusNet, Inc.
15  *
16  * This program is free software: you can redistribute it and/or modify
17  * it under the terms of the GNU Affero General Public License as published by
18  * the Free Software Foundation, either version 3 of the License, or
19  * (at your option) any later version.
20  *
21  * This program is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the
24  * GNU Affero General Public License for more details.
25  *
26  * You should have received a copy of the GNU Affero General Public License
27  * along with this program. If not, see <http://www.gnu.org/licenses/>.
28  */
29
30 if (!defined('STATUSNET')) {
31     exit(1);
32 }
33
34 require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
35
36 /**
37  * Data class for group direct messages
38  *
39  * @category GroupPrivateMessage
40  * @package  StatusNet
41  * @author   Evan Prodromou <evan@status.net>
42  * @license  http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
43  * @link     http://status.net/
44  *
45  * @see      DB_DataObject
46  */
47
48 class Group_message extends Memcached_DataObject
49 {
50     public $__table = 'group_message'; // table name
51     public $id;                        // char(36)  primary_key not_null
52     public $uri;                       // varchar(255)
53     public $from_profile;              // int
54     public $to_group;                  // int
55     public $content;
56     public $rendered;
57     public $url;
58     public $created;
59
60     /**
61      * Get an instance by key
62      *
63      * This is a utility method to get a single instance with a given key value.
64      *
65      * @param string $k Key to use to lookup (usually 'user_id' for this class)
66      * @param mixed  $v Value to lookup
67      *
68      * @return Group_message object found, or null for no hits
69      *
70      */
71     function staticGet($k, $v=null)
72     {
73         return Memcached_DataObject::staticGet('Group_message', $k, $v);
74     }
75
76     /**
77      * return table definition for DB_DataObject
78      *
79      * DB_DataObject needs to know something about the table to manipulate
80      * instances. This method provides all the DB_DataObject needs to know.
81      *
82      * @return array array of column definitions
83      */
84     function table()
85     {
86         return array('id' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
87                      'uri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
88                      'from_profile' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
89                      'to_group' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
90                      'content' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
91                      'rendered' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL,
92                      'url' => DB_DATAOBJECT_STR,
93                      'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
94     }
95
96     /**
97      * return key definitions for DB_DataObject
98      *
99      * DB_DataObject needs to know about keys that the table has, since it
100      * won't appear in StatusNet's own keys list. In most cases, this will
101      * simply reference your keyTypes() function.
102      *
103      * @return array list of key field names
104      */
105     function keys()
106     {
107         return array_keys($this->keyTypes());
108     }
109
110     /**
111      * return key definitions for Memcached_DataObject
112      *
113      * @return array associative array of key definitions, field name to type:
114      *         'K' for primary key: for compound keys, add an entry for each component;
115      *         'U' for unique keys: compound keys are not well supported here.
116      */
117     function keyTypes()
118     {
119         return array('id' => 'K', 'uri' => 'U');
120     }
121
122     static function send($user, $group, $text)
123     {
124         if (!$user->hasRight(Right::NEWMESSAGE)) {
125             // XXX: maybe break this out into a separate right
126             throw new Exception(sprintf(_('User %s not allowed to send private messages.'),
127                                         $user->nickname));
128         }
129
130         Group_privacy_settings::ensurePost($user, $group);
131
132         $text = $user->shortenLinks($text);
133
134         // We use the same limits as for 'regular' private messages.
135
136         if (Message::contentTooLong($text)) {
137             throw new Exception(sprintf(_m('That\'s too long. Maximum message size is %d character.',
138                                            'That\'s too long. Maximum message size is %d characters.',
139                                            Message::maxContent()),
140                                         Message::maxContent()));
141         }
142
143         // Valid! Let's do this thing!
144
145         $gm = new Group_message();
146         
147         $gm->id           = UUID::gen();
148         $gm->uri          = common_local_url('showgroupmessage', array('id' => $gm->id));
149         $gm->from_profile = $user->id;
150         $gm->to_group     = $group->id;
151         $gm->content      = $text; // XXX: is this cool?!
152         $gm->rendered     = common_render_text($text);
153         $gm->url          = $gm->uri;
154         $gm->created      = common_sql_now();
155
156         // This throws a conniption if there's a problem
157
158         $gm->insert();
159
160         $gm->distribute();
161
162         return $gm;
163     }
164
165     function distribute()
166     {
167         $group = User_group::staticGet('id', $this->to_group);
168         
169         $member = $group->getMembers();
170
171         while ($member->fetch()) {
172             Group_message_profile::send($this, $member);
173         }
174     }
175
176     function getGroup()
177     {
178         $group = User_group::staticGet('id', $this->to_group);
179         if (empty($group)) {
180             throw new ServerException(_('No group for group message'));
181         }
182         return $group;
183     }
184
185     function getSender()
186     {
187         $sender = Profile::staticGet('id', $this->from_profile);
188         if (empty($sender)) {
189             throw new ServerException(_('No sender for group message'));
190         }
191         return $sender;
192     }
193
194     static function forGroup($group, $offset, $limit)
195     {
196         // XXX: cache
197         $gm = new Group_message();
198
199         $gm->to_group = $group->id;
200         $gm->orderBy('created DESC');
201         $gm->limit($offset, $limit);
202
203         $gm->find();
204
205         return $gm;
206     }
207
208 }