<?php /* 0.3a - 25.04.2006 - fixed utf-8 posts bug 0.2a - 31.03.2006 - fixed autodelete feature - fixed empty lj-cut removing + 'no conversion' option added 0.1a - 29.03.2006 * Initial version */ require_once "ConvertCharset.class.php"; class NP_LiveJournal extends NucleusPlugin { // name of plugin function getName() { return 'LiveJournal Plugin'; } // author of plugin function getAuthor() { return 'Evgeny Lykhin'; } // an URL to the plugin website // can also be of the form mailto:foo@bar.com function getURL() { return 'http://www.lykhin.com/nucleus-livejournal'; } // version of the plugin function getVersion() { return '0.1a'; } function getMinNucleusVersion() { return 220; } // a description to be shown on the installed plugins listing function getDescription() { return 'This plugin allows to copy posts from Nucleus directly to LiveJournal.'; } function doSkinVar($skinType) { echo 'LiveJournal Plugin!'; } function getPostedBy() { return '<p align="right" style="font-size: 7pt; line-height: 8pt; margin-top: 0pt; margin-bottom: 0pt"><a href="' . $this->getURL() .'">Nucleus LiveJournal Plugin © Evgeny Lykhin</a></p>'; } function install() { global $CONF; $this->createOption('livejournal_username', 'LiveJournal username', 'text'); $this->createOption('livejournal_password', 'LiveJournal password (it\'s not safe, use MD5-coded instead!)', 'password'); $this->createOption('livejournal_md5pswrd', 'LiveJournal password, MD5-coded', 'text'); $indexurl = $CONF['IndexURL']; $this->createOption('livejournal_template', 'LiveJournal post template', 'textarea', "%body%\r\n<lj-cut>%more%</lj-cut>\r\n\r\n<font size=-2><a href=\"" . $indexurl . "index.php?itemid=%itemid%\">Read more</a></font>"); $this->createOption('livejournal_encoding', 'Nucleus posts encoding table', 'select', 'windows-1251', $this->GetEncodingOptionList()); $this->createOption('livejournal_autoupd', 'Auto update LiveJournal post after edit in Nucleus', 'yesno', 'yes'); $this->createOption('livejournal_autodel', 'Auto delete from LiveJournal after delete in Nucleus', 'yesno', 'yes'); $this->createOption('livejournal_nocomm', 'Disable comments in LiveJournal posts', 'yesno', 'no'); sql_query(sprintf("CREATE TABLE %s (item_id int(11), ljitem_id int(11), ljitem_url varchar(255)) TYPE=MYISAM",sql_table('plug_livejournal_items'))); } function unInstall() { $this->deleteOption('livejournal_username'); $this->deleteOption('livejournal_password'); $this->deleteOption('livejournal_md5pswrd'); $this->deleteOption('livejournal_template'); $this->deleteOption('livejournal_encoding'); $this->deleteOption('livejournal_autoupd'); $this->deleteOption('livejournal_autodel'); $this->deleteItemOption('livejournal_nocomm'); } function getTableList() { return array(sql_table('plug_livejournal_items')); } function getEventList() { return array('PostAddItem', 'PreUpdateItem', 'PostDeleteItem'); } var $errormsg; var $lasturl; function ReadItemData($itemid) { $query = sprintf("SELECT ititle, ibody, imore, itime, iclosed, idraft, icat FROM %s WHERE inumber=%d", sql_table('item'), intval($itemid)); $res = sql_query($query); if ($res) $data = mysql_fetch_array($res); else $data = 0; mysql_free_result($res); return $data; } function event_PostAddItem(&$params) { $itemid = $params['itemid']; $data = $this->ReadItemData($itemid); if ($data) { $username = $this->getOption("livejournal_username"); $password = $this->getOption("livejournal_password"); $hpassword = $this->getOption("livejournal_md5pswrd"); $encoding = $this->getOption("livejournal_encoding"); $title = $data[0]; $body = $data[1]; $more = $data[2]; $time = $data[3]; $closed = $data[4]; $draft = $data[5]; $text = $this->GetText($itemid, $title, $body, $more); if ($encoding != 'no conversion') { $ConvertCharset = new ConvertCharset; $title = $ConvertCharset->Convert($title, $encoding, "utf-8"); $text = $ConvertCharset->Convert($text, $encoding, "utf-8"); } if ($username && ($password || $hpassword) && !$draft) { $nocomm = $closed || ($this->getOption('livejournal_nocomm') == 'yes'); $lj_itemid = $this->LiveJournalPost($username, $password, $hpassword, $title, $text, $time, $nocomm); if ($this->errormsg) doError($this->errormsg); if ($lj_itemid >= 0) { $query = sprintf("INSERT INTO %s (item_id, ljitem_id, ljitem_url) VALUES (%d, %d, '%s')",sql_table('plug_livejournal_items'), $itemid, $lj_itemid, $this->lasturl); sql_query($query); } } } } function GetText($itemid, $title, $body, $more) { $template = $this->getOption("livejournal_template"); $search = array("%body%", "%more%", "%itemid%", "%title%"); $replace = array($body, $more, $itemid, $title); $text = str_replace($search, $replace, $template); // Remove empty lj-cuts $text = preg_replace("#<lj-cut\s*(text=\".*\")?>\s*</lj-cut>#", "", $text); $text .= $this->getPostedBy(); return $text; } function GetLJItemId($itemid) { $res = sql_query(sprintf("SELECT * FROM %s WHERE item_id = %d", sql_table('plug_livejournal_items'), $itemid)); if ($res && $data = mysql_fetch_array($res)) $ljitem_id = $data['ljitem_id']; else $ljitem_id = 0; return $ljitem_id; } function event_PostDeleteItem(&$params) { if ($this->getOption('livejournal_autodel') == 'yes') { $itemid = $params['itemid']; $ljitem_id = $this->GetLJItemId($itemid); if ($ljitem_id) { $query = sprintf("DELETE FROM %s WHERE item_id = %d", sql_table('plug_livejournal_items'), $itemid); sql_query($query); $username = $this->getOption("livejournal_username"); $password = $this->getOption("livejournal_password"); $hpassword = $this->getOption("livejournal_md5pswrd"); $this->LiveJournalPost($username, $password, $hpassword, "", "", 0, 0, $ljitem_id); } } } function event_PreUpdateItem(&$params) { if ($this->getOption('livejournal_autoupd') == 'yes') { $itemid = $params['itemid']; $ljitem_id = $this->GetLJItemId($itemid); if ($ljitem_id) { $username = $this->getOption("livejournal_username"); $password = $this->getOption("livejournal_password"); $hpassword = $this->getOption("livejournal_md5pswrd"); $encoding = $this->getOption("livejournal_encoding"); $title = $params['title']; $body = $params['body']; $more = $params['more']; $text = $this->GetText($itemid, $title, $body, $more); if ($encoding != 'no conversion') { $ConvertCharset = new ConvertCharset; $title = $ConvertCharset->Convert($title, $encoding, "utf-8"); $text = $ConvertCharset->Convert($text, $encoding, "utf-8"); } $data = $this->ReadItemData($itemid); if ($data && $username && ($password || $hpassword) && !$draft) { $time = $data[3]; $closed = $data[4]; $nocomm = $closed || ($this->getOption('livejournal_nocomm') == 'yes'); $this->LiveJournalPost($username, $password, $hpassword, $title, $text, $time, $nocomm, $ljitem_id); if ($this->errormsg) doError($this->errormsg); } } } } function LiveJournalPost($username, $password, $hpassword, $title, $body, $time, $nocomm, $itemid = -1) { if ($itemid >= 0) $methodname = 'LJ.XMLRPC.editevent'; else $methodname = 'LJ.XMLRPC.postevent'; $this->lasturl = ""; $this->errormsg = ""; if (!class_exists('xmlrpcmsg')) { global $DIR_LIBS; include($DIR_LIBS . 'xmlrpc.inc.php'); } if ($hpassword) { $psw_name = "hpassword"; $psw = $hpassword; } else { $psw_name = "password"; $psw = $password; } $time_arr = getdate(strtotime($time)); $param_arr = array( 'username' => new xmlrpcval($username), $psw_name => new xmlrpcval($psw), 'event' => new xmlrpcval($body), 'subject' => new xmlrpcval($title), 'lineendings' => new xmlrpcval('pc'), 'year' => new xmlrpcval($time_arr["year"]), 'mon' => new xmlrpcval($time_arr["mon"]), 'day' => new xmlrpcval($time_arr["mday"]), 'hour' => new xmlrpcval($time_arr["hours"]), 'min' => new xmlrpcval($time_arr["minutes"]), 'ver' => new xmlrpcval(1) ); if ($itemid >= 0) $param_arr['itemid'] = new xmlrpcval($itemid); $param_arr['props'] = new xmlrpcval(array('opt_nocomments' => new xmlrpcval($nocomm, 'boolean')), 'struct'); $struct = new xmlrpcval($param_arr, 'struct'); $message = new xmlrpcmsg($methodname, array($struct)); $client = new xmlrpc_client('/interface/xmlrpc', 'livejournal.com', 80); if ($client) { $response = $client->send($message, 15); if ($response) { $value = $response->value(); if ($value) { $itemidval = $value->structmem("itemid"); if ($itemidval) $itemid = $itemidval->scalarval(); $urlval = $value->structmem("url"); if ($urlval) $this->lasturl = $urlval->scalarval(); } else $this->errormsg = "LiveJournal plugin error: " . $response->faultString(); } } else $this->errormsg = "LiveJournal plugin error: can't connect to livejournal.com"; return $itemid; } function GetEncodingOptionList() { global $DIR_PLUGINS; $dir = $DIR_PLUGINS . "ConvertTables"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); $result = "no conversion|no conversion"; foreach ($files as $file) if ($file[0] != '.') $result .= '|' . $file . '|' . $file; return $result; } } ?>