Save notice-to-status mapping in its own table

Introduce a table mapping notices to Twitter statuses. Initialize
this table at checkSchema() time. Save the mapping when we push
or pull statuses. Use the table to determine if a notice has a
Twitter equivalent.
This commit is contained in:
Evan Prodromou
2010-09-04 23:45:55 -04:00
parent 4aca91d05d
commit 16b219f1ef
4 changed files with 236 additions and 17 deletions

View File

@@ -194,18 +194,21 @@ class TwitterBridgePlugin extends Plugin
*/
function onAutoload($cls)
{
$dir = dirname(__FILE__);
switch ($cls) {
case 'TwittersettingsAction':
case 'TwitterauthorizationAction':
case 'TwitterloginAction':
case 'TwitteradminpanelAction':
include_once INSTALLDIR . '/plugins/TwitterBridge/' .
strtolower(mb_substr($cls, 0, -6)) . '.php';
include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php';
return false;
case 'TwitterOAuthClient':
case 'TwitterQueueHandler':
include_once INSTALLDIR . '/plugins/TwitterBridge/' .
strtolower($cls) . '.php';
include_once $dir . '/' . strtolower($cls) . '.php';
return false;
case 'Notice_to_status':
include_once $dir . '/' . $cls . '.php';
return false;
default:
return true;
@@ -360,5 +363,52 @@ class TwitterBridgePlugin extends Plugin
}
}
}
/**
* Database schema setup
*
* We maintain a table mapping StatusNet notices to Twitter statuses
*
* @see Schema
* @see ColumnDef
*
* @return boolean hook value; true means continue processing, false means stop.
*/
function onCheckSchema()
{
$schema = Schema::get();
// For storing user-submitted flags on profiles
$schema->ensureTable('notice_to_status',
array(new ColumnDef('notice_id', 'integer', null,
false, 'PRI'),
new ColumnDef('status_id', 'integer', null,
false, 'UNI'),
new ColumnDef('created', 'datetime', null,
false)));
// We update any notices that may have come in from
// Twitter that we don't have a status_id for. Note that
// this won't catch notices that originated at this StatusNet site.
$n = new Notice();
$n->query('SELECT notice.id, notice.uri ' .
'FROM notice LEFT JOIN notice_to_status ' .
'ON notice.id = notice_to_status.notice_id ' .
'WHERE notice.source = "twitter"' .
'AND notice_to_status.status_id = NULL');
while ($n->fetch()) {
if (preg_match('#^http://twitter.com/[\w_.]+/status/(\d+)$#', $n->uri, $match)) {
$status_id = $match[1];
Notice_to_status::saveNew($n->id, $status_id);
}
}
return true;
}
}