summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/ClientInfo.hpp10
-rw-r--r--src/crsm.cpp92
-rw-r--r--src/crsm.hpp47
3 files changed, 81 insertions, 68 deletions
diff --git a/src/ClientInfo.hpp b/src/ClientInfo.hpp
index cccff95..3371a18 100644
--- a/src/ClientInfo.hpp
+++ b/src/ClientInfo.hpp
@@ -116,4 +116,14 @@ public:
antiFloodList.push_back(newDateTime);
return antiFloodList.size() > maxCount;
}
+
+ inline bool empty()
+ {
+ return *this != ClientInfo();
+ }
+
+ inline void clear()
+ {
+ *this = ClientInfo();
+ }
};
diff --git a/src/crsm.cpp b/src/crsm.cpp
index 51136c8..e819b4e 100644
--- a/src/crsm.cpp
+++ b/src/crsm.cpp
@@ -183,7 +183,7 @@ void CRSM::readServerOutput()
if(infoMatch.exactMatch(joinExp.cap(1)))
{
const ClientInfo& info = ClientInfo::clonkClient(infoMatch.cap(3), infoMatch.cap(1), infoMatch.cap(2).toInt());
- clients.insert(info.pcName, info);
+ Session.Clonk.Clients.insert(info.pcName, info);
QTimer *timer = new QTimer;
connect(timer, SIGNAL(timeout()), &greetMapper, SLOT(map()));
connect(timer, SIGNAL(timeout()), timer, SLOT(deleteLater()));
@@ -243,20 +243,20 @@ void CRSM::readServerOutput()
connection->sendCommand(IrcCommand::createMessage(Config.IRC.IngameChannel, "[Clonk] " + info.toString() + " entfernt" + leaveExp.cap(2)));
}
- if(info == sessionAdmin)
+ if(info == Session.Clonk.Admin)
{
- leaveAdmins.insert(info, QDateTime::currentDateTime());
+ Session.Clonk.LeaveAdmins.insert(info, QDateTime::currentDateTime());
writeToServer("Rundenadmin wurde freigegeben.\n");
- sessionAdmin = ClientInfo();
+ Session.Clonk.Admin.clear();
}
- clients.remove(info.pcName);
+ Session.Clonk.Clients.remove(info.pcName);
}
- if(clients.size() == 0 && userlist.length() > 0 && !Session.UserWish)
+ if(Session.Clonk.Clients.size() == 0 && userlist.length() > 0 && !Session.UserWish)
{
processManager->closeProgFifos();
}
- else if(clients.size() == 0 && Config.Clonk.Server.EmptyTimer != -1 && (Session.CountDown == -1 || Session.CountDown > Config.Clonk.Server.EmptyTimer))
+ else if(Session.Clonk.Clients.size() == 0 && Config.Clonk.Server.EmptyTimer != -1 && (Session.CountDown == -1 || Session.CountDown > Config.Clonk.Server.EmptyTimer))
{
writeToServer("/start " + QString::number(Config.Clonk.Server.EmptyTimer) + "\n");
}
@@ -388,10 +388,6 @@ void CRSM::scenarioFinished()
return;
}
Session.clear();
- sessionAdmin = ClientInfo();
- ircAdmin = ClientInfo();
- clients.clear();
- leaveAdmins.clear();
if((autoHost || userlist.length() > 0) && !finish)
nextScen();
else if(!Config.IRC.IngameChannel.isEmpty())
@@ -502,9 +498,9 @@ void CRSM::ircMessageReceived(IrcMessage *message)
{
stopAliasWishEditing();
}
- if(ircAdmin == ClientInfo::ircClient(message->nick()))
+ if(Session.IRC.Admin == ClientInfo::ircClient(message->nick()))
{
- ircAdmin = ClientInfo();
+ Session.IRC.Admin.clear();
}
}
else if(message->type() == IrcMessage::Kick)
@@ -544,20 +540,20 @@ void CRSM::ircMessageReceived(IrcMessage *message)
void CRSM::greet(QString pcName)
{
- if(!clients.contains(pcName))
+ if(!Session.Clonk.Clients.contains(pcName))
return;
- const ClientInfo &info = clients.value(pcName);
+ const ClientInfo &info = Session.Clonk.Clients.value(pcName);
writeToServer(QString("Hallo " + info.nick + "!\n"));
- if(leaveAdmins.contains(info))
+ if(Session.Clonk.LeaveAdmins.contains(info))
{
int timeGone;
- if((timeGone = leaveAdmins.value(info).secsTo(QDateTime::currentDateTime())) < Config.Clonk.Chat.RegainAdminTime && sessionAdmin != ClientInfo())
+ if((timeGone = Session.Clonk.LeaveAdmins.value(info).secsTo(QDateTime::currentDateTime())) < Config.Clonk.Chat.RegainAdminTime && !Session.Clonk.Admin.empty())
{
writeToServer(info.nick + "! Der Rundenadmin wurde freigegeben, weil du das Spiel verlassen hast.\nDu hast noch " + QString::number(Config.Clonk.Chat.RegainAdminTime - timeGone) + "s Zeit um den Rundenadmin zurückzuholen.\n");
}
else
{
- leaveAdmins.remove(info);
+ Session.Clonk.LeaveAdmins.remove(info);
}
}
}
@@ -1268,13 +1264,13 @@ UserType CRSM::clientUserType(const ClientInfo &client)
case Clonk:
if(Config.Clonk.Chat.Moderators.contains(client.CUID))
return Moderator;
- if(sessionAdmin == client)
+ if(Session.Clonk.Admin == client)
return Admin;
break;
case IRC:
if(ircMods.contains(client.nick))
return Moderator;
- else if(ircAdmin == client)
+ else if(Session.IRC.Admin == client)
return Admin;
break;
case Management:
@@ -1391,20 +1387,20 @@ void CRSM::ircCheckUserStatus(const ClientInfo &requester, const ClientInfo &sub
void CRSM::setIngameAdmin(const ClientInfo &client, const QString& newAdmin)
{
- if(clients.contains(newAdmin))
+ if(Session.Clonk.Clients.contains(newAdmin))
{
- const ClientInfo& info = clients.value(newAdmin);
- if(sessionAdmin == info)
+ const ClientInfo& info = Session.Clonk.Clients.value(newAdmin);
+ if(Session.Clonk.Admin == info)
{
respond(client, info.toString() + " ist bereits Rundenadmin.\n");
}
- sessionAdmin = info;
+ Session.Clonk.Admin = info;
}
else
{
bool notFound = true, ambigous = false;
ClientInfo foundClient;
- foreach(const ClientInfo& client, clients)
+ foreach(const ClientInfo& client, Session.Clonk.Clients)
{
if(client.nick == newAdmin)
{
@@ -1427,16 +1423,16 @@ void CRSM::setIngameAdmin(const ClientInfo &client, const QString& newAdmin)
respond(client, newAdmin + " wurde nicht gefunden!\n");
return;
}
- else if(sessionAdmin == foundClient)
+ else if(Session.Clonk.Admin == foundClient)
{
- respond(client, sessionAdmin.toString() + " ist bereits Rundenadmin!\n");
+ respond(client, Session.Clonk.Admin.toString() + " ist bereits Rundenadmin!\n");
return;
}
else
{
- sessionAdmin = foundClient;
+ Session.Clonk.Admin = foundClient;
}
- respond(client, sessionAdmin.toString() + " wurde als Rundenadmin eingetragen.\n");
+ respond(client, Session.Clonk.Admin.toString() + " wurde als Rundenadmin eingetragen.\n");
}
}
@@ -1537,11 +1533,11 @@ void CRSM::prepareAndConnectIrc()
ClientInfo &CRSM::getClientInfo(const QString &pcName, int cuid, const QString &user)
{
- if(!clients.contains(pcName))
+ if(!Session.Clonk.Clients.contains(pcName))
{
- clients.insert(pcName, ClientInfo::clonkClient(user, pcName, cuid));
+ Session.Clonk.Clients.insert(pcName, ClientInfo::clonkClient(user, pcName, cuid));
}
- return clients[pcName];
+ return Session.Clonk.Clients[pcName];
}
void CRSM::exit()
@@ -1600,7 +1596,7 @@ CMD_FUNCTION_IMPL(admin)
switch(client.interface)
{
case Clonk:
- interfaceAdminPtr = &sessionAdmin;
+ interfaceAdminPtr = &Session.Clonk.Admin;
if(args == Config.Auto.Volatile.Clonk.ServerNick || args == Config.Auto.Volatile.Clonk.ServerPCName)
{
respond(client, "Der Server kann nicht als Rundenadmin eingetragen werden!\n");
@@ -1608,7 +1604,7 @@ CMD_FUNCTION_IMPL(admin)
}
break;
case IRC:
- interfaceAdminPtr = &ircAdmin;
+ interfaceAdminPtr = &Session.IRC.Admin;
break;
default:
return;
@@ -1619,9 +1615,9 @@ CMD_FUNCTION_IMPL(admin)
respond(client, "Du ist bereits Rundenadmin!\n");
return;
}
- else if((ircAdmin != ClientInfo() || sessionAdmin != ClientInfo()) && userType < Admin && !(leaveAdmins.contains(client) && leaveAdmins.value(client).secsTo(QDateTime::currentDateTime()) < Config.Clonk.Chat.RegainAdminTime))
+ else if((!Session.IRC.Admin.empty() || !Session.Clonk.Admin.empty()) && userType < Admin && !(Session.Clonk.LeaveAdmins.contains(client) && Session.Clonk.LeaveAdmins.value(client).secsTo(QDateTime::currentDateTime()) < Config.Clonk.Chat.RegainAdminTime))
{
- respond(client, ircAdmin.toString() + (!ircAdmin.nick.isEmpty() && !sessionAdmin.nick.isEmpty() ? " und " : "") + sessionAdmin.toString() + " ist bereits Rundenadmin!\n");
+ respond(client, Session.IRC.Admin.toString() + (!Session.IRC.Admin.nick.isEmpty() && !Session.Clonk.Admin.nick.isEmpty() ? " und " : "") + Session.Clonk.Admin.toString() + " ist bereits Rundenadmin!\n");
return;
}
else if(args.isEmpty())
@@ -1663,13 +1659,13 @@ CMD_FUNCTION_IMPL(host)
{
userlist << scen;
respond(client, "Szenario " + scen.name + " wurde der Warteschlange" + (scen.league ? " mit Liga" : "") + " hinzugefügt.\n");
- if(userlist.length() == 1 && !Session.UserWish && !Session.Running && Session.Hosting && clients.size() > 0)
+ if(userlist.length() == 1 && !Session.UserWish && !Session.Running && Session.Hosting && Session.Clonk.Clients.size() > 0)
respond(client, "Überrede alle Spieler zu leaven und dein Wunsch wird sofort gehostet ;-)\n");
else if(!Session.Hosting)
{
nextScen();
}
- else if(clients.size() == 0 && !Session.UserWish)
+ else if(Session.Clonk.Clients.size() == 0 && !Session.UserWish)
{
processManager->closeProgFifos();
}
@@ -1824,26 +1820,26 @@ CMD_FUNCTION_IMPL(io)
CMD_FUNCTION_IMPL(pcNamePassToClonk)
ClientInfo info;
- if(clients.contains(args))
+ if(Session.Clonk.Clients.contains(args))
{
- info = clients.value(args);
+ info = Session.Clonk.Clients.value(args);
}
else
{
- foreach(const QString& pcName, clients.keys())
+ foreach(const QString& pcName, Session.Clonk.Clients.keys())
{
if(pcName.compare(args, Qt::CaseInsensitive) == 0)
{
- info = clients.value(pcName);
+ info = Session.Clonk.Clients.value(pcName);
break;
}
}
}
- if(info == ClientInfo())
+ if(info.empty())
{
bool notFound = true, ambigous = false;
ClientInfo foundClient;
- foreach(const ClientInfo& client, clients)
+ foreach(const ClientInfo& client, Session.Clonk.Clients)
{
if(client.nick.compare(args, Qt::CaseInsensitive) == 0)
{
@@ -1888,14 +1884,14 @@ CMD_FUNCTION_IMPL(ingameadmin)
}
CMD_FUNCTION_IMPL(noadmin)
- ircAdmin = ClientInfo();
- sessionAdmin = ClientInfo();
+ Session.IRC.Admin.clear();
+ Session.Clonk.Admin.clear();
respond(client, "Rundenadmin wurde freigegeben.\n");
}
CMD_FUNCTION_IMPL(clientlist)
QString response = "Verbundene Clients (Chatnick (PC-Name)): ";
- foreach(const ClientInfo& connectedClient, clients)
+ foreach(const ClientInfo& connectedClient, Session.Clonk.Clients)
{
if(connectedClient.nick.isEmpty())
continue;
@@ -2061,7 +2057,7 @@ IRC_CHECK_CALLBACK_IMPL(ircSetAdmin)
}
else
{
- ircAdmin = subject;
+ Session.IRC.Admin = subject;
respond(requester, subject.toString() + " wurde als Rundenadmin eingetragen.\n");
}
}
diff --git a/src/crsm.hpp b/src/crsm.hpp
index fc4ee1e..117df9d 100644
--- a/src/crsm.hpp
+++ b/src/crsm.hpp
@@ -50,21 +50,6 @@ public:
ScenarioSettings(const QString& name, const ClientInfo& client, bool league = false) : name(name), league(league), wishClient(client) {}
};
-struct CRSMSession {
- bool IrcUseIngameChat = false;
- bool League = false;
- bool Running = false;
- bool UserWish = false;
- int CountDown = -1;
- bool Hosting = false;
- QString ScenarioName = "";
-
- void clear()
- {
- *this = CRSMSession();
- }
-};
-
class CRSM : public QObject
{
private:
@@ -120,6 +105,33 @@ private slots:
private:
CRSMConfig Config;
+
+ struct CRSMSession {
+ bool IrcUseIngameChat = false;
+ bool League = false;
+ bool Running = false;
+ bool UserWish = false;
+ int CountDown = -1;
+ bool Hosting = false;
+ QString ScenarioName = "";
+
+
+ struct {
+ ClientInfo Admin;
+ QMap<QString, ClientInfo> Clients;
+ QMap<ClientInfo, QDateTime> LeaveAdmins;
+ } Clonk;
+
+ struct {
+ ClientInfo Admin;
+ } IRC;
+
+ void clear()
+ {
+ *this = CRSMSession();
+ }
+ } Session;
+
QList<ScenarioSettings> userlist;
QList<ScenarioSettings> autolist;
QList<ScenarioSettings> nextAutoScens;
@@ -135,14 +147,9 @@ private:
QTextStream *qout;
QTextStream *qin;
bool finish;
- CRSMSession Session;
- QMap<QString, ClientInfo> clients;
IrcConnection *connection = 0;
bool autoHost = true;
QSignalMapper greetMapper;
- ClientInfo sessionAdmin;
- ClientInfo ircAdmin;
- QMap<ClientInfo, QDateTime> leaveAdmins;
QFile *logfile;
QTextStream logstream;
QTextCodec *codec;