diff options
Diffstat (limited to 'Swiftob/Swiftob.cpp')
| -rw-r--r-- | Swiftob/Swiftob.cpp | 117 | 
1 files changed, 117 insertions, 0 deletions
diff --git a/Swiftob/Swiftob.cpp b/Swiftob/Swiftob.cpp new file mode 100644 index 0000000..6c6dad0 --- /dev/null +++ b/Swiftob/Swiftob.cpp @@ -0,0 +1,117 @@ +/* + * Copyright (c) 2011 Kevin Smith + * Licensed under the GNU General Public License v3. + * See Documentation/Licenses/GPLv3.txt for more information. + */ + +#include "Swiftob/Swiftob.h" + +#include <string> +#include <iostream> +#include <boost/bind.hpp> + +#include <Swiften/JID/JID.h> +#include <Swiften/Base/String.h> +#include <Swiften/Presence/PresenceSender.h> + +#include "Swiftob/Users.h" +#include "Swiftob/Storage.h" + + +po::options_description Swiftob::getOptionsDescription() { +	po::options_description result("Options"); +	result.add_options() +		("path", po::value<std::string>(), "Configuration folder") +		("help", "produce help message") +		("init", "Reset everything (Really, everything, be careful, you only want to use this on first run).") +		("jid", po::value<std::string>(), "JID to use") +		("password", po::value<std::string>(), "password") +		("initial-owner", po::value<std::string>(), "Initial bot owner (JID)") +		; +	return result; +} + +Swiftob::Swiftob(const po::variables_map& options) : options_(options), networkFactories_(&eventLoop_), quitting_(false) { +	std::string path; +	path = options["path"].as<std::string>(); +	client_ = new Swift::Client(Swift::JID(options["jid"].as<std::string>()), options["password"].as<std::string>(), &networkFactories_); +	storage_ = new Storage(boost::filesystem::path(path) / "settings.txt"); +	mucs_ = new MUCs(client_, storage_); +	users_ = new Users(client_, mucs_); +	commands_ = new Commands(users_, client_, storage_, mucs_); +	lua_ = new LuaCommands(commands_, path, client_, networkFactories_.getTimerFactory(), mucs_); +	client_->onConnected.connect(boost::bind(&Swiftob::handleConnected, this)); +	client_->onDisconnected.connect(boost::bind(&Swiftob::handleDisconnected, this, _1)); +	client_->onMessageReceived.connect(boost::bind(&Swiftob::handleMessageReceived, this, _1)); +	if (options_.count("init") > 0) { + +	} else if (options_.count("jid") > 0 || options_.count("password") > 0 || options_.count("initial-owner") == 0) { +		std::cout << "Ignoring initial config options without --initial" << std::endl; +	} +	client_->setAlwaysTrustCertificates(); +	client_->setSoftwareVersion("Swiftob", "pregit", ""); +	client_->connect(); +	eventLoop_.run(); +} + +void Swiftob::handleConnected() { +	std::cout << "Connected" << std::endl; +	if (options_.count("init") > 0) {}{ /* FIXME: Not ready for persistence yet*/ +		users_->clearAll(); +		users_->addUser(Users::User(Swift::JID(options_["initial-owner"].as<std::string>()), Users::User::Owner)); +	} +	Swift::Presence::ref presence(new Swift::Presence()); +	presence->setStatus("Online and botty"); +	client_->getPresenceSender()->sendPresence(presence); +} + +void Swiftob::handleDisconnected(const boost::optional<Swift::ClientError>& /*error*/) { +	std::cout << "Disconnected" << std::endl; +	/* FIXME: check if last connect was more than a minute ago. If so, go ahead and connect, if not then wait a minute before connecting.*/ +	if (quitting_) { +		eventLoop_.stop(); +	} else { +		client_->connect(); +	} +} + +void Swiftob::handleMessageReceived(Swift::Message::ref message) { +	Swift::Message::Type type = message->getType(); +	if (type == Swift::Message::Error || type == Swift::Message::Headline) { +		std::cout << "Ignoring typed message" << std::endl; +		return; +	} +	std::string body = message->getBody(); +	std::cout << "Got message with body " << body << std::endl; +	if (body.size() == 0) { +		std::cout << "Not handling empty body" << std::endl; +		return; +	} +	/*Convert body into !command if it's not a MUC, and it misses the bang*/ +	std::string bangBody(body); +	if (type != Swift::Message::Groupchat && body[0] != '!') { +		bangBody = "!" + body; +	} +	std::cout << "After banging, body is " << bangBody << std::endl; +	std::pair<std::string, std::string> split = Swift::String::getSplittedAtFirst(bangBody, ' '); +	std::string commandName(split.first); +	commandName = Swift::String::getSplittedAtFirst(commandName, '!').second; +	/*FIXME: remove leading bang in commandName*/ +	if (commands_->hasCommand(commandName)) { +		std::cout << "Matched command " << commandName << std::endl; +		commands_->runCommand(commandName, split.second, message); +	} +} + +Swiftob::~Swiftob() { +	delete lua_; +	delete commands_; +	delete storage_; +	delete users_; +	delete client_; +} + +int Swiftob::exec() { +	return 0; +} +  | 
 Swift