SparrowBot/app/todomodule.cpp
2015-08-25 13:21:12 +02:00

156 lines
5.4 KiB
C++

#include "todomodule.h"
#include "message.h"
#include <time.h>
#include <QStringList>
#include <QDateTime>
TodoModule::TodoModule()
{
}
bool TodoModule::messageHandler(Message msg)
{
if(msg.command.compare(QString("PRIVMSG"), Qt::CaseInsensitive) == 0)
{
if(msg.args.startsWith("!todo "))
{
answer = usage(TODO);
Task t;
int deltaIndex = 1;
t.isPrivate = !msg.target.contains(getChan());
t.recipient = msg.nick;
t.repeat = 0;
QStringList splitter = msg.args.split(' ');
if(splitter[deltaIndex].compare("to") == 0)
{
deltaIndex += 2;
t.recipient = splitter[2];
}
if(splitter.size() < deltaIndex+2)
return true;
QString dateString = splitter[deltaIndex];
QStringList dateSplitter;
bool ok;
if(dateString.startsWith("date("))
{
answer = usage(DATE);
dateString = dateString.mid(5, dateString.size() - 6);
dateSplitter = dateString.split('/');
if(dateSplitter.size() < 2)
return true;
int day = dateSplitter[0].toUInt(&ok);
if(!ok || day > 31 || day < 1) return true;
dateSplitter = dateSplitter[1].split('-');
int month = dateSplitter[0].toUInt(&ok);
if(!ok || month > 12 || month < 1) return true;
int hours = 0;
int minutes = 0;
int seconds = 0;
if(dateSplitter.size() > 1)
{
dateSplitter = dateSplitter[1].split(':');
hours = dateSplitter[0].toUInt(&ok);
if(!ok || hours > 23) return true;
if(dateSplitter.size() > 1)
{
minutes = dateSplitter[1].toUInt(&ok);
if(!ok || minutes > 59) return true;
}
if(dateSplitter.size() > 2)
{
seconds = dateSplitter[2].toUInt(&ok);
if(!ok || seconds > 59) return true;
}
}
QDateTime date(QDate(QDate::currentDate().year(), month, day), QTime(hours, minutes, seconds));
t.date = date.toTime_t();
}
else
{
answer = usage(DURATION);
dateSplitter = dateString.split(':');
int hours = dateSplitter[0].toUInt(&ok);
int minutes = 0;
int seconds = 0;
if(!ok) return true;
if(dateSplitter.size() > 1)
{
minutes = dateSplitter[1].toUInt(&ok);
if(!ok || minutes > 59) return true;
}
if(dateSplitter.size() > 2)
{
seconds = dateSplitter[2].toUInt(&ok);
if(!ok || seconds > 59) return true;
}
QDateTime date = QDateTime::currentDateTime();
minutes += hours*60;
seconds += minutes*60;
date.addSecs(seconds);
t.date = date.toTime_t();
}
++deltaIndex;
if(splitter[deltaIndex].compare("every") == 0)
{
answer = usage(DURATION);
dateSplitter = dateString.split(':');
int hours = dateSplitter[0].toUInt(&ok);
int minutes = 0;
int seconds = 0;
if(!ok) return true;
if(dateSplitter.size() > 1)
{
minutes = dateSplitter[1].toUInt(&ok);
if(!ok || minutes > 59) return true;
}
if(dateSplitter.size() > 2)
{
seconds = dateSplitter[2].toUInt(&ok);
if(!ok || seconds > 59) return true;
}
minutes += hours*60;
seconds += minutes*60;
t.repeat = seconds;
deltaIndex += 2;
}
QString desc;
bool first = true;
for(int i=deltaIndex; i<splitter.size(); ++i)
{
if(first)
first = false;
else
desc.append(" ");
desc.append(splitter[i]);
}
t.description = desc;
t.emitter = msg.nick;
tasks.push_back(t);
answer = say(QString("todo successfully added : from %1 to %2 triggering the %3, repeating every %4 seconds, and diplaying this message : %5")
.arg(t.emitter)
.arg(t.recipient)
.arg(QDateTime::fromTime_t(t.date).toString())
.arg((int)(t.repeat))
.arg(t.description));
return true;
}
}
return false;
}
QString TodoModule::usage(int type)
{
switch(type)
{
default:
case TODO:
return say("usage = !todo [to TARGET] DATE | DURATION [every DURATION] DESCRIPTION");
case DURATION:
return say("DURATION = HOURS[:MINUTES[:SECONDS]]");
case DATE:
return say("DATE = date(DAY/MONTH[-HOUR[:MINUTE[:SECOND]]])");
}
}