// Zoe AIM Away Message RSS Feed Generator // // Seth King and Douglas Thrift // // $Id$ #include "Publisher.hpp" #include "Rss.hpp" #include "Atom.hpp" Publisher::Publisher(const std::set& buddies, const Database& database, bool start) : buddies(buddies), database(database), start(start) { if (start) publisher.Spawn(etl::Bind<0>(&Publisher::publish, this)); } int Publisher::publish() { cerr << bright << green << "Started publisher daemon.\n" << reset; while (true) { Stamp now, next(now + Hour(1)); api::Thread thread(etl::Bind<0>(&Publisher::update, this)); next.setSeconds(0); next.setMinutes(0); if (Zoe::debug) cerr << "now = " << now << "\nnext = " << next << '\n'; while (now < next - Minute(1)) { sleep(Minute(1)); now = Stamp(); } while (now < next) { sleep(1); now = Stamp(); } thread.Join(); } } int Publisher::update() { cerr << bright << yellow << "Started updating feeds.\n" << reset; Stamp stamp; ext::Handle db(dbi::Connect(database.driver, database.host, database.user, database.password, database.db)); db->Execute("DELETE FROM messages WHERE stamp<'" + ext::String(stamp - Day(30)) + "'"); for (std::set::const_iterator buddy(buddies.begin()); buddy != buddies.end(); ++buddy) { ext::Handle messages(db->Execute("SELECT stamp, message FROM messages WHERE id='" + lexical_cast(buddy->getId()) + "'")); std::vector messages_; while (messages->MoveNext()) messages_.push_back(AwayMessage(messages->GetString("message"), messages->GetString("stamp"))); Rss rss(*buddy, messages_, stamp); Atom atom(*buddy, messages_, stamp); cerr << bright << yellow << "Updated feeds for " << blue << *buddy << yellow << ".\n" << reset; } cerr << bright << yellow << "Finished updating feeds.\n" << reset; }