#include "irccoms.h"
#include <QJsonDocument>
-
+#include <QScriptEngine>
+#include <QString>
+#include <QFile>
extern "C" AbstractSinkManager * create(AbstractRoutingEngine* routingengine, map<string, string> config)
{
return new BluemonkeySinkManager(routingengine, config);
}
-BluemonkeySink::BluemonkeySink(AbstractRoutingEngine* engine, map<string, string> config): QObject(0),AbstractSink(engine, config)
+QVariant gvariantToQVariant(GVariant *value)
+{
+ switch (g_variant_classify(value)) {
+ case G_VARIANT_CLASS_BOOLEAN:
+ return QVariant((bool) g_variant_get_boolean(value));
+
+ case G_VARIANT_CLASS_BYTE:
+ return QVariant((char) g_variant_get_byte(value));
+
+ case G_VARIANT_CLASS_INT16:
+ return QVariant((int) g_variant_get_int16(value));
+
+ case G_VARIANT_CLASS_UINT16:
+ return QVariant((unsigned int) g_variant_get_uint16(value));
+
+ case G_VARIANT_CLASS_INT32:
+ return QVariant((int) g_variant_get_int32(value));
+
+ case G_VARIANT_CLASS_UINT32:
+ return QVariant((unsigned int) g_variant_get_uint32(value));
+
+ case G_VARIANT_CLASS_INT64:
+ return QVariant((long long) g_variant_get_int64(value));
+
+ case G_VARIANT_CLASS_UINT64:
+ return QVariant((unsigned long long) g_variant_get_uint64(value));
+
+ case G_VARIANT_CLASS_DOUBLE:
+ return QVariant(g_variant_get_double(value));
+
+ case G_VARIANT_CLASS_STRING:
+ return QVariant(g_variant_get_string(value, NULL));
+
+ default:
+ return QVariant::Invalid;
+ }
+}
+
+BluemonkeySink::BluemonkeySink(AbstractRoutingEngine* e, map<string, string> config): QObject(0), AbstractSink(e, config)
{
irc = new IrcCommunication(this);
- irc->connect("chat.freenode.com",8001,"","tripzero","bluemoney","");
+ irc->connect("chat.freenode.com",8001,"","tripzero","bluemonkey","");
connect(irc,&IrcCommunication::connected, [&]() {
irc->join("#linuxice");
});
+ engine = new QScriptEngine(this);
+
+ auth = new Authenticate(this);
+
+ QScriptValue value = engine->newQObject(this);
+ engine->globalObject().setProperty("bluemonkey", value);
+
+ connect(irc, &IrcCommunication::message, [&](QString sender, QString prefix, QString codes ) {
+
+ if(codes.contains("authenticate"))
+ {
+
+ int i = codes.indexOf("authenticate");
+ QString pin = codes.mid(i+10);
+ pin = pin.trimmed();
+
+
+ if(!auth->authorize(prefix, pin))
+ irc->respond(sender,"failed");
+
+ }
+ else if(codes.startsWith("bluemonkey"))
+ {
+ if(!auth->isAuthorized(prefix))
+ {
+ irc->respond(sender, "denied");
+ return;
+ }
+ irc->respond(sender, engine->evaluate(codes).toString());
+ }
+ });
+
+ loadConfig("config.js");
+
}
return new Property(str.toStdString(), routingEngine, this);
}
+bool BluemonkeySink::authenticate(QString pass)
+{
-QVariant Property::value()
+}
+
+void BluemonkeySink::loadConfig(QString str)
{
- QJsonDocument doc;
+ QFile file(str);
+ if(!file.open(QIODevice::ReadOnly))
+ {
+ qDebug()<<"failed to open config file: "<<str;
+ return;
+ }
+
+ QString script = file.readAll();
+
+ file.close();
+
+ engine->evaluate(script);
+}
- doc.fromJson(mValue->toString().c_str());
- return doc.toVariant();
+QVariant Property::value()
+{
+ return gvariantToQVariant(mValue->toVariant());
}
void Property::setValue(QVariant v)
}
Property::Property(VehicleProperty::Property prop, AbstractRoutingEngine* re, QObject *parent)
- :QObject(parent), AbstractSink(re, std::map<std::string,std::string>())
+ :QObject(parent), AbstractSink(re, std::map<std::string,std::string>()),mValue(nullptr)
{
setType(prop.c_str());
}
void Property::setType(QString t)
{
+ if(mValue && type() != "")
+ routingEngine->unsubscribeToProperty(type().toStdString(),this);
+
+ routingEngine->subscribeToProperty(t.toStdString(),this);
+
mValue = VehicleProperty::getPropertyTypeForPropertyNameValue(t.toStdString());
AsyncPropertyRequest request;
propertyChanged(reply->property, reply->value,uuid());
delete reply;
};
+
+ routingEngine->getPropertyAsync(request);
}
#include "abstractsink.h"
#include <QObject>
#include <QVariant>
+#include <QJsonDocument>
+#include "uuidhelper.h"
+
+#include "authenticate.h"
class IrcCommunication;
+class QScriptEngine;
class Property: public QObject, public AbstractSink
{
QString type();
void setType(QString t);
- virtual PropertyList subscriptions();
- virtual void supportedChanged(PropertyList supportedProperties);
+ virtual PropertyList subscriptions() { PropertyList list; list.push_back(type().toStdString()); return list; }
+ virtual void supportedChanged(PropertyList ){ }
virtual void propertyChanged(VehicleProperty::Property property, AbstractPropertyType* value, std::string uuid)
{
mValue = value->copy();
+
+ QJsonDocument doc;
+
+ doc.fromJson(mValue->toString().c_str());
+
+ changed(doc.toVariant());
}
- virtual std::string uuid();
+ virtual std::string uuid() { return amb::createUuid(); }
QVariant value();
void setValue(QVariant v);
Q_SIGNALS:
+
void changed(QVariant val);
private:
{
Q_OBJECT
public:
- BluemonkeySink(AbstractRoutingEngine* engine, map<string, string> config);
+ BluemonkeySink(AbstractRoutingEngine* e, map<string, string> config);
virtual PropertyList subscriptions();
virtual void supportedChanged(PropertyList supportedProperties);
virtual void propertyChanged(VehicleProperty::Property property, AbstractPropertyType* value, std::string uuid);
QObject* subscribeTo(QString str);
+ bool authenticate(QString pass);
+
+ void loadConfig(QString str);
+
Q_SIGNALS:
private:
IrcCommunication* irc;
+ QScriptEngine* engine;
+ Authenticate* auth;
};
class BluemonkeySinkManager: public AbstractSinkManager