Message.php 7.97 KB
Newer Older
1 2 3 4
<?php
/**
 * Table Definition for message
 */
5
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
6

7
class Message extends Managed_DataObject
8 9 10 11 12 13 14 15 16
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    public $__table = 'message';                         // table name
    public $id;                              // int(4)  primary_key not_null
    public $uri;                             // varchar(255)  unique_key
    public $from_profile;                    // int(4)   not_null
    public $to_profile;                      // int(4)   not_null
17 18 19
    public $content;                         // text()
    public $rendered;                        // text()
    public $url;                             // varchar(255)
20 21
    public $created;                         // datetime()   not_null
    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
22
    public $source;                          // varchar(32)
23 24 25

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
26

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
    public static function schemaDef()
    {
        return array(
            'fields' => array(
                'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'),
                'uri' => array('type' => 'varchar', 'length' => 255, 'description' => 'universally unique identifier'),
                'from_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is from'),
                'to_profile' => array('type' => 'int', 'not null' => true, 'description' => 'who the message is to'),
                'content' => array('type' => 'text', 'description' => 'message content'),
                'rendered' => array('type' => 'text', 'description' => 'HTML version of the content'),
                'url' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL of any attachment (image, video, bookmark, whatever)'),
                'created' => array('type' => 'datetime', 'not null' => true, 'description' => 'date this record was created'),
                'modified' => array('type' => 'timestamp', 'not null' => true, 'description' => 'date this record was modified'),
                'source' => array('type' => 'varchar', 'length' => 32, 'description' => 'source of comment, like "web", "im", or "clientname"'),
            ),
            'primary key' => array('id'),
            'unique keys' => array(
                'message_uri_key' => array('uri'),
            ),
            'foreign keys' => array(
                'message_from_profile_fkey' => array('profile', array('from_profile' => 'id')),
                'message_to_profile_fkey' => array('profile', array('to_profile' => 'id')),
            ),
            'indexes' => array(
                // @fixme these are really terrible indexes, since you can only sort on one of them at a time.
                // looks like we really need a (to_profile, created) for inbox and a (from_profile, created) for outbox
                'message_from_idx' => array('from_profile'),
                'message_to_idx' => array('to_profile'),
                'message_created_idx' => array('created'),
            ),
        );
    }

60 61
    function getFrom()
    {
62 63
        return Profile::staticGet('id', $this->from_profile);
    }
64

65 66
    function getTo()
    {
67 68
        return Profile::staticGet('id', $this->to_profile);
    }
69

70
    static function saveNew($from, $to, $content, $source) {
71 72 73
        $sender = Profile::staticGet('id', $from);

        if (!$sender->hasRight(Right::NEWMESSAGE)) {
74
            // TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them.
75 76 77
            throw new ClientException(_('You are banned from sending direct messages.'));
        }

78 79
        $user = User::staticGet('id', $sender->id);

80
        $msg = new Message();
81

82 83
        $msg->from_profile = $from;
        $msg->to_profile = $to;
84 85 86 87 88 89
        if ($user) {
            // Use the sender's URL shortening options.
            $msg->content = $user->shortenLinks($content);
        } else {
            $msg->content = common_shorten_links($content);
        }
90
        $msg->rendered = common_render_text($msg->content);
91 92
        $msg->created = common_sql_now();
        $msg->source = $source;
93

94
        $result = $msg->insert();
95

96 97
        if (!$result) {
            common_log_db_error($msg, 'INSERT', __FILE__);
98
            // TRANS: Message given when a message could not be stored on the server.
99 100
            return _('Could not insert message.');
        }
101

102 103
        $orig = clone($msg);
        $msg->uri = common_local_url('showmessage', array('message' => $msg->id));
104

105
        $result = $msg->update($orig);
106

107 108
        if (!$result) {
            common_log_db_error($msg, 'UPDATE', __FILE__);
109
            // TRANS: Message given when a message could not be updated on the server.
110 111
            return _('Could not update message with new URI.');
        }
112

113 114
        return $msg;
    }
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130

    static function maxContent()
    {
        $desclimit = common_config('message', 'contentlimit');
        // null => use global limit (distinct from 0!)
        if (is_null($desclimit)) {
            $desclimit = common_config('site', 'textlimit');
        }
        return $desclimit;
    }

    static function contentTooLong($content)
    {
        $contentlimit = self::maxContent();
        return ($contentlimit > 0 && !empty($content) && (mb_strlen($content) > $contentlimit));
    }
131 132 133 134 135 136 137 138

    function notify()
    {
        $from = User::staticGet('id', $this->from_profile);
        $to   = User::staticGet('id', $this->to_profile);

        mail_notify_message($this, $from, $to);
    }
139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186

    function getSource()
    {
        $ns = new Notice_source();
        if (!empty($this->source)) {
            switch ($this->source) {
            case 'web':
            case 'xmpp':
            case 'mail':
            case 'omb':
            case 'system':
            case 'api':
                $ns->code = $this->source;
                break;
            default:
                $ns = Notice_source::staticGet($this->source);
                if (!$ns) {
                    $ns = new Notice_source();
                    $ns->code = $this->source;
                    $app = Oauth_application::staticGet('name', $this->source);
                    if ($app) {
                        $ns->name = $app->name;
                        $ns->url  = $app->source_url;
                    }
                }
                break;
            }
        }
        return $ns;
    }

    function asActivity()
    {
        $act = new Activity();

        if (Event::handle('StartMessageAsActivity', array($this, &$act))) {

            $act->id      = TagURI::mint(sprintf('activity:message:%d', $this->id));
            $act->time    = strtotime($this->created);
            $act->link    = $this->url;

            $profile = Profile::staticGet('id', $this->from_profile);

            if (empty($profile)) {
                throw new Exception(sprintf("Sender profile not found: %d", $this->from_profile));
            }
            
            $act->actor            = ActivityObject::fromProfile($profile);
187
            $act->actor->extra[]   = $profile->profileInfo(null);
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216

            $act->verb = ActivityVerb::POST;

            $act->objects[] = ActivityObject::fromMessage($this);

            $ctx = new ActivityContext();

            $rprofile = Profile::staticGet('id', $this->to_profile);

            if (empty($rprofile)) {
                throw new Exception(sprintf("Receiver profile not found: %d", $this->to_profile));
            }

            $ctx->attention[] = $rprofile->getUri();
            $ctx->attentionType[$rprofile->getUri()] = ActivityObject::PERSON;

            $act->context = $ctx;

            $source = $this->getSource();

            if ($source) {
                $act->generator = ActivityObject::fromNoticeSource($source);
            }

            Event::handle('EndMessageAsActivity', array($this, &$act));
        }

        return $act;
    }
217
}