-
Notifications
You must be signed in to change notification settings - Fork 1
/
tree.cpp
95 lines (76 loc) · 2.65 KB
/
tree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#include "tree.h"
#include "namedatabase.h"
#include "messageprocessor.h"
#include "permission.h"
#include <QtCore>
const int Tree::TreeDelay = 10000;
Tree::Tree(NameDatabase *namedb, MessageProcessor *msgproc, Permission *perm, QObject *parent) :
QObject(parent), nameDatabase(namedb), messageProcessor(msgproc), permission(perm)
{
queueTimer = new QTimer(this);
queueTimer->setInterval(TreeDelay);
connect(queueTimer, SIGNAL(timeout()), this, SLOT(processQueue()));
}
void Tree::input(const QString &gid, const QString &uid, const QString &str, bool inpm, bool isAdmin)
{
qint64 gidnum = gid.mid(5).toLongLong();
if (nameDatabase->groups().keys().contains(gidnum) && str.startsWith("!tree"))
{
int perm = permission->getPermission(gidnum, "tree", "use", isAdmin, inpm);
if (perm == 1)
{
QStringList args = str.split(' ', QString::SkipEmptyParts);
inpm = inpm || (args.size() > 1 && args[1].toLower().startsWith("pm"));
QByteArray identity = inpm ? uid.toUtf8() : gid.toUtf8();
queue.push_back(QueueData(gidnum, identity));
if (queue.size() == 1 && !queueTimer->isActive())
processQueue();
}
else if (perm == 2)
permission->sendRequest(gid, uid, str, inpm);
}
}
void Tree::processTree()
{
QProcess *proc = qobject_cast<QProcess *>(sender());
if (proc->exitCode() == 0)
messageProcessor->sendCommand("send_document " + queue.front().second + " tree.png");
proc->deleteLater();
queue.pop_front();
queueTimer->start();
}
void Tree::processQueue()
{
if (queue.isEmpty())
{
queueTimer->stop();
return;
}
QFile file("tree.dot");
qint64 gidnum = queue.front().first;
if (file.open(QIODevice::WriteOnly))
{
QTextStream TS(&file);
TS.setCodec(QTextCodec::codecForName("UTF-8"));
TS << "digraph TelegramUsers" << endl << "{" << endl;
QMapIterator<qint64, qint64> users(nameDatabase->userList(gidnum));
while (users.hasNext())
{
users.next();
TS << " \"" << messageProcessor->convertToName(users.value()) << "\" -> \""
<< messageProcessor->convertToName(users.key()) << "\"" << endl;
}
TS << "}" << endl;
QProcess *graphviz = new QProcess(this);
connect(graphviz, SIGNAL(finished(int)), this, SLOT(processTree()));
QStringList args;
args << "-Tpng" << "tree.dot";
graphviz->setStandardOutputFile("tree.png");
graphviz->start("dot", args);
}
else
{
queue.pop_front();
processQueue();
}
}