We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Notice.php 4.55 KB
Newer Older
Evan Prodromou's avatar
Evan Prodromou committed
1
<?php
Evan Prodromou's avatar
Evan Prodromou committed
2
/*
Evan Prodromou's avatar
Evan Prodromou committed
3 4
 * Laconica - a distributed open-source microblogging tool
 * Copyright (C) 2008, Controlez-Vous, Inc.
Evan Prodromou's avatar
Evan Prodromou committed
5
 *
Evan Prodromou's avatar
Evan Prodromou committed
6 7 8 9
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
Evan Prodromou's avatar
Evan Prodromou committed
10
 *
Evan Prodromou's avatar
Evan Prodromou committed
11 12 13 14
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
Evan Prodromou's avatar
Evan Prodromou committed
15
 *
Evan Prodromou's avatar
Evan Prodromou committed
16 17 18
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
Evan Prodromou's avatar
Evan Prodromou committed
19

Evan Prodromou's avatar
Evan Prodromou committed
20
if (!defined('LACONICA')) { exit(1); }
Evan Prodromou's avatar
Evan Prodromou committed
21

Evan Prodromou's avatar
Evan Prodromou committed
22 23 24
/**
 * Table Definition for notice
 */
25
require_once INSTALLDIR.'classes/Memcached_DataObject.php';
Evan Prodromou's avatar
Evan Prodromou committed
26

27
class Notice extends Memcached_DataObject 
Evan Prodromou's avatar
Evan Prodromou committed
28 29 30 31 32 33 34
{
    ###START_AUTOCODE
    /* the code below is auto generated do not remove the above tag */

    public $__table = 'notice';                          // table name
    public $id;                              // int(4)  primary_key not_null
    public $profile_id;                      // int(4)   not_null
35
    public $uri;                             // varchar(255)  unique_key
36 37 38
    public $content;                         // varchar(140)  
    public $rendered;                        // text()  
    public $url;                             // varchar(255)  
Evan Prodromou's avatar
Evan Prodromou committed
39 40
    public $created;                         // datetime()   not_null
    public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
41
    public $reply_to;                        // int(4)  
Evan Prodromou's avatar
Evan Prodromou committed
42
    public $is_local;                        // tinyint(1)  
43
    public $source;                          // varchar(32)  
Evan Prodromou's avatar
Evan Prodromou committed
44 45

    /* Static get */
46
    function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Notice',$k,$v); }
Evan Prodromou's avatar
Evan Prodromou committed
47 48 49

    /* the code above is auto generated do not remove the tag below */
    ###END_AUTOCODE
Evan Prodromou's avatar
Evan Prodromou committed
50 51

	function getProfile() {
Evan Prodromou's avatar
Evan Prodromou committed
52
		return Profile::staticGet($this->profile_id);
Evan Prodromou's avatar
Evan Prodromou committed
53
	}
Mike Cochrane's avatar
Mike Cochrane committed
54 55 56

	function saveTags() {
		/* extract all #hastags */
Garret Buell's avatar
Garret Buell committed
57
		$count = preg_match_all('/(?:^|\s)#([A-Za-z0-9_\-\.]{1,64})/', strtolower($this->content), $match);
Mike Cochrane's avatar
Mike Cochrane committed
58 59 60
		if (!$count) {
			return true;
		}
Garret Buell's avatar
Garret Buell committed
61 62 63
		
		/* elide characters we don't want in the tag */
		$match[1] = str_replace(array('-', '_', '.'), '', $match[1]);
Mike Cochrane's avatar
Mike Cochrane committed
64 65 66 67 68 69 70 71 72 73

		/* Add them to the database */
		foreach(array_unique($match[1]) as $hashtag) {
			$tag = DB_DataObject::factory('Notice_tag');
			$tag->notice_id = $this->id;
			$tag->tag = $hashtag;
			$tag->created = $this->created;
			$id = $tag->insert();
			if (!$id) {
				$last_error = PEAR::getStaticProperty('DB_DataObject','lastError');
Evan Prodromou's avatar
Evan Prodromou committed
74
				common_log(LOG_ERR, 'DB error inserting hashtag: ' . $last_error->message);
Mike Cochrane's avatar
Mike Cochrane committed
75 76 77 78 79 80
				common_server_error(sprintf(_('DB error inserting hashtag: %s'), $last_error->message));
				return;
			}
		}
		return true;
	}
81 82

	static function saveNew($profile_id, $content, $source=NULL, $is_local=1, $reply_to=NULL, $uri=NULL) {
83 84 85 86
		
		$notice = new Notice();
		$notice->profile_id = $profile_id;
		$notice->is_local = $is_local;
87
		$notice->reply_to = $reply_to;
88
		$notice->created = common_sql_now();
89 90
		$notice->content = $content;
		$notice->rendered = common_render_content($notice->content, $notice);
Ori Avtalion's avatar
Ori Avtalion committed
91 92
		$notice->source = $source;
		$notice->uri = $uri;
Evan Prodromou's avatar
Evan Prodromou committed
93
		
94 95 96 97 98 99
		$id = $notice->insert();

		if (!$id) {
			return _('Problem saving notice.');
		}

Ori Avtalion's avatar
Ori Avtalion committed
100 101 102
		# Update the URI after the notice is in the database
		if (!$uri) {
			$orig = clone($notice);
103
			$notice->uri = common_notice_uri($notice);
104

Ori Avtalion's avatar
Ori Avtalion committed
105 106 107
			if (!$notice->update($orig)) {
				return _('Problem saving notice.');
			}
108 109
		}

110 111
		# XXX: do we need to change this for remote users?
		
112 113
		common_save_replies($notice);
		$notice->saveTags();
114 115 116 117 118

		# Clear the cache for subscribed users, so they'll update at next request
		# XXX: someone clever could prepend instead of clearing the cache
		
		if (common_config('memcached', 'enabled')) {
119
			$notice->blowSubsCache();
120
		}
121 122 123
		
		return $notice;
	}
124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
	
	function blowSubsCache() {
		$cache = new Memcache();
		if ($cache->connect(common_config('memcached', 'server'), common_config('memcached', 'port'))) {
			$user = new User();
			
			$user->query('SELECT id ' .
						 'FROM user JOIN subscription ON user.id = subscription.subscriber ' .
						 'WHERE subscription.subscribed = ' . $this->profile_id);
			
			while ($user->fetch()) {
				$cache->delete(common_cache_key('user:notices_with_friends:' . $user->id));
			}
			
			$user->free();
			unset($user);
		}
	}
Evan Prodromou's avatar
Evan Prodromou committed
142
}