Merge pull request #1101 from ctrlaltca/registration

[WIP] In-client Registration support
This commit is contained in:
woogerboy21 2015-05-30 13:49:04 -04:00
commit 28ccec711e
54 changed files with 3669 additions and 66 deletions

View file

@ -29,9 +29,10 @@ enum ClientStatus {
StatusDisconnected,
StatusDisconnecting,
StatusConnecting,
StatusAwaitingWelcome,
StatusRegistering,
StatusActivating,
StatusLoggingIn,
StatusLoggedIn
StatusLoggedIn,
};
class AbstractClient : public QObject {
@ -59,6 +60,9 @@ signals:
void buddyListReceived(const QList<ServerInfo_User> &buddyList);
void ignoreListReceived(const QList<ServerInfo_User> &ignoreList);
void replayAddedEventReceived(const Event_ReplayAdded &event);
void registerAccepted();
void registerAcceptedNeedsActivate();
void activateAccepted();
void sigQueuePendingCommand(PendingCommand *pend);
private:
@ -71,7 +75,8 @@ protected slots:
void processProtocolItem(const ServerMessage &item);
protected:
QMap<int, PendingCommand *> pendingCommands;
QString userName, password;
QString userName, password, email, country, realName, token;
int gender;
void setStatus(ClientStatus _status);
int getNewCmdId() { return nextCmdId++; }
virtual void sendCommandContainer(const CommandContainer &cont) = 0;

View file

@ -0,0 +1,355 @@
#include <QSettings>
#include <QLabel>
#include <QCheckBox>
#include <QGridLayout>
#include <QHBoxLayout>
#include <QDialogButtonBox>
#include <QDebug>
#include "dlg_register.h"
#include "pb/serverinfo_user.pb.h"
DlgRegister::DlgRegister(QWidget *parent)
: QDialog(parent)
{
QSettings settings;
settings.beginGroup("server");
hostLabel = new QLabel(tr("&Host:"));
hostEdit = new QLineEdit(settings.value("hostname", "cockatrice.woogerworks.com").toString());
hostLabel->setBuddy(hostEdit);
portLabel = new QLabel(tr("&Port:"));
portEdit = new QLineEdit(settings.value("port", "4747").toString());
portLabel->setBuddy(portEdit);
playernameLabel = new QLabel(tr("Player &name:"));
playernameEdit = new QLineEdit(settings.value("playername", "Player").toString());
playernameLabel->setBuddy(playernameEdit);
passwordLabel = new QLabel(tr("P&assword:"));
passwordEdit = new QLineEdit(settings.value("password").toString());
passwordLabel->setBuddy(passwordEdit);
passwordEdit->setEchoMode(QLineEdit::Password);
emailLabel = new QLabel(tr("Email:"));
emailEdit = new QLineEdit();
emailLabel->setBuddy(emailEdit);
genderLabel = new QLabel(tr("Gender:"));
genderEdit = new QComboBox();
genderLabel->setBuddy(genderEdit);
genderEdit->insertItem(0, QIcon(":/resources/genders/unknown.svg"), tr("Undefined"));
genderEdit->insertItem(1, QIcon(":/resources/genders/male.svg"), tr("Male"));
genderEdit->insertItem(2, QIcon(":/resources/genders/female.svg"), tr("Female"));
genderEdit->setCurrentIndex(0);
countryLabel = new QLabel(tr("Country:"));
countryEdit = new QComboBox();
countryLabel->setBuddy(countryEdit);
countryEdit->insertItem(0, tr("Undefined"));
countryEdit->addItem(QPixmap(":/resources/countries/ad.svg"), "ad");
countryEdit->addItem(QIcon(":/resources/countries/ae.svg"), "ae");
countryEdit->addItem(QIcon(":/resources/countries/af.svg"), "af");
countryEdit->addItem(QIcon(":/resources/countries/ag.svg"), "ag");
countryEdit->addItem(QIcon(":/resources/countries/ai.svg"), "ai");
countryEdit->addItem(QIcon(":/resources/countries/al.svg"), "al");
countryEdit->addItem(QIcon(":/resources/countries/am.svg"), "am");
countryEdit->addItem(QIcon(":/resources/countries/ao.svg"), "ao");
countryEdit->addItem(QIcon(":/resources/countries/aq.svg"), "aq");
countryEdit->addItem(QIcon(":/resources/countries/ar.svg"), "ar");
countryEdit->addItem(QIcon(":/resources/countries/as.svg"), "as");
countryEdit->addItem(QIcon(":/resources/countries/at.svg"), "at");
countryEdit->addItem(QIcon(":/resources/countries/au.svg"), "au");
countryEdit->addItem(QIcon(":/resources/countries/aw.svg"), "aw");
countryEdit->addItem(QIcon(":/resources/countries/ax.svg"), "ax");
countryEdit->addItem(QIcon(":/resources/countries/az.svg"), "az");
countryEdit->addItem(QIcon(":/resources/countries/ba.svg"), "ba");
countryEdit->addItem(QIcon(":/resources/countries/bb.svg"), "bb");
countryEdit->addItem(QIcon(":/resources/countries/bd.svg"), "bd");
countryEdit->addItem(QIcon(":/resources/countries/be.svg"), "be");
countryEdit->addItem(QIcon(":/resources/countries/bf.svg"), "bf");
countryEdit->addItem(QIcon(":/resources/countries/bg.svg"), "bg");
countryEdit->addItem(QIcon(":/resources/countries/bh.svg"), "bh");
countryEdit->addItem(QIcon(":/resources/countries/bi.svg"), "bi");
countryEdit->addItem(QIcon(":/resources/countries/bj.svg"), "bj");
countryEdit->addItem(QIcon(":/resources/countries/bl.svg"), "bl");
countryEdit->addItem(QIcon(":/resources/countries/bm.svg"), "bm");
countryEdit->addItem(QIcon(":/resources/countries/bn.svg"), "bn");
countryEdit->addItem(QIcon(":/resources/countries/bo.svg"), "bo");
countryEdit->addItem(QIcon(":/resources/countries/bq.svg"), "bq");
countryEdit->addItem(QIcon(":/resources/countries/br.svg"), "br");
countryEdit->addItem(QIcon(":/resources/countries/bs.svg"), "bs");
countryEdit->addItem(QIcon(":/resources/countries/bt.svg"), "bt");
countryEdit->addItem(QIcon(":/resources/countries/bv.svg"), "bv");
countryEdit->addItem(QIcon(":/resources/countries/bw.svg"), "bw");
countryEdit->addItem(QIcon(":/resources/countries/by.svg"), "by");
countryEdit->addItem(QIcon(":/resources/countries/bz.svg"), "bz");
countryEdit->addItem(QIcon(":/resources/countries/ca.svg"), "ca");
countryEdit->addItem(QIcon(":/resources/countries/cc.svg"), "cc");
countryEdit->addItem(QIcon(":/resources/countries/cd.svg"), "cd");
countryEdit->addItem(QIcon(":/resources/countries/cf.svg"), "cf");
countryEdit->addItem(QIcon(":/resources/countries/cg.svg"), "cg");
countryEdit->addItem(QIcon(":/resources/countries/ch.svg"), "ch");
countryEdit->addItem(QIcon(":/resources/countries/ci.svg"), "ci");
countryEdit->addItem(QIcon(":/resources/countries/ck.svg"), "ck");
countryEdit->addItem(QIcon(":/resources/countries/cl.svg"), "cl");
countryEdit->addItem(QIcon(":/resources/countries/cm.svg"), "cm");
countryEdit->addItem(QIcon(":/resources/countries/cn.svg"), "cn");
countryEdit->addItem(QIcon(":/resources/countries/co.svg"), "co");
countryEdit->addItem(QIcon(":/resources/countries/cr.svg"), "cr");
countryEdit->addItem(QIcon(":/resources/countries/cu.svg"), "cu");
countryEdit->addItem(QIcon(":/resources/countries/cv.svg"), "cv");
countryEdit->addItem(QIcon(":/resources/countries/cw.svg"), "cw");
countryEdit->addItem(QIcon(":/resources/countries/cx.svg"), "cx");
countryEdit->addItem(QIcon(":/resources/countries/cy.svg"), "cy");
countryEdit->addItem(QIcon(":/resources/countries/cz.svg"), "cz");
countryEdit->addItem(QIcon(":/resources/countries/de.svg"), "de");
countryEdit->addItem(QIcon(":/resources/countries/dj.svg"), "dj");
countryEdit->addItem(QIcon(":/resources/countries/dk.svg"), "dk");
countryEdit->addItem(QIcon(":/resources/countries/dm.svg"), "dm");
countryEdit->addItem(QIcon(":/resources/countries/do.svg"), "do");
countryEdit->addItem(QIcon(":/resources/countries/dz.svg"), "dz");
countryEdit->addItem(QIcon(":/resources/countries/ec.svg"), "ec");
countryEdit->addItem(QIcon(":/resources/countries/ee.svg"), "ee");
countryEdit->addItem(QIcon(":/resources/countries/eg.svg"), "eg");
countryEdit->addItem(QIcon(":/resources/countries/eh.svg"), "eh");
countryEdit->addItem(QIcon(":/resources/countries/er.svg"), "er");
countryEdit->addItem(QIcon(":/resources/countries/es.svg"), "es");
countryEdit->addItem(QIcon(":/resources/countries/et.svg"), "et");
countryEdit->addItem(QIcon(":/resources/countries/fi.svg"), "fi");
countryEdit->addItem(QIcon(":/resources/countries/fj.svg"), "fj");
countryEdit->addItem(QIcon(":/resources/countries/fk.svg"), "fk");
countryEdit->addItem(QIcon(":/resources/countries/fm.svg"), "fm");
countryEdit->addItem(QIcon(":/resources/countries/fo.svg"), "fo");
countryEdit->addItem(QIcon(":/resources/countries/fr.svg"), "fr");
countryEdit->addItem(QIcon(":/resources/countries/ga.svg"), "ga");
countryEdit->addItem(QIcon(":/resources/countries/gb.svg"), "gb");
countryEdit->addItem(QIcon(":/resources/countries/gd.svg"), "gd");
countryEdit->addItem(QIcon(":/resources/countries/ge.svg"), "ge");
countryEdit->addItem(QIcon(":/resources/countries/gf.svg"), "gf");
countryEdit->addItem(QIcon(":/resources/countries/gg.svg"), "gg");
countryEdit->addItem(QIcon(":/resources/countries/gh.svg"), "gh");
countryEdit->addItem(QIcon(":/resources/countries/gi.svg"), "gi");
countryEdit->addItem(QIcon(":/resources/countries/gl.svg"), "gl");
countryEdit->addItem(QIcon(":/resources/countries/gm.svg"), "gm");
countryEdit->addItem(QIcon(":/resources/countries/gn.svg"), "gn");
countryEdit->addItem(QIcon(":/resources/countries/gp.svg"), "gp");
countryEdit->addItem(QIcon(":/resources/countries/gq.svg"), "gq");
countryEdit->addItem(QIcon(":/resources/countries/gr.svg"), "gr");
countryEdit->addItem(QIcon(":/resources/countries/gs.svg"), "gs");
countryEdit->addItem(QIcon(":/resources/countries/gt.svg"), "gt");
countryEdit->addItem(QIcon(":/resources/countries/gu.svg"), "gu");
countryEdit->addItem(QIcon(":/resources/countries/gw.svg"), "gw");
countryEdit->addItem(QIcon(":/resources/countries/gy.svg"), "gy");
countryEdit->addItem(QIcon(":/resources/countries/hk.svg"), "hk");
countryEdit->addItem(QIcon(":/resources/countries/hm.svg"), "hm");
countryEdit->addItem(QIcon(":/resources/countries/hn.svg"), "hn");
countryEdit->addItem(QIcon(":/resources/countries/hr.svg"), "hr");
countryEdit->addItem(QIcon(":/resources/countries/ht.svg"), "ht");
countryEdit->addItem(QIcon(":/resources/countries/hu.svg"), "hu");
countryEdit->addItem(QIcon(":/resources/countries/id.svg"), "id");
countryEdit->addItem(QIcon(":/resources/countries/ie.svg"), "ie");
countryEdit->addItem(QIcon(":/resources/countries/il.svg"), "il");
countryEdit->addItem(QIcon(":/resources/countries/im.svg"), "im");
countryEdit->addItem(QIcon(":/resources/countries/in.svg"), "in");
countryEdit->addItem(QIcon(":/resources/countries/io.svg"), "io");
countryEdit->addItem(QIcon(":/resources/countries/iq.svg"), "iq");
countryEdit->addItem(QIcon(":/resources/countries/ir.svg"), "ir");
countryEdit->addItem(QIcon(":/resources/countries/is.svg"), "is");
countryEdit->addItem(QIcon(":/resources/countries/it.svg"), "it");
countryEdit->addItem(QIcon(":/resources/countries/je.svg"), "je");
countryEdit->addItem(QIcon(":/resources/countries/jm.svg"), "jm");
countryEdit->addItem(QIcon(":/resources/countries/jo.svg"), "jo");
countryEdit->addItem(QIcon(":/resources/countries/jp.svg"), "jp");
countryEdit->addItem(QIcon(":/resources/countries/ke.svg"), "ke");
countryEdit->addItem(QIcon(":/resources/countries/kg.svg"), "kg");
countryEdit->addItem(QIcon(":/resources/countries/kh.svg"), "kh");
countryEdit->addItem(QIcon(":/resources/countries/ki.svg"), "ki");
countryEdit->addItem(QIcon(":/resources/countries/km.svg"), "km");
countryEdit->addItem(QIcon(":/resources/countries/kn.svg"), "kn");
countryEdit->addItem(QIcon(":/resources/countries/kp.svg"), "kp");
countryEdit->addItem(QIcon(":/resources/countries/kr.svg"), "kr");
countryEdit->addItem(QIcon(":/resources/countries/kw.svg"), "kw");
countryEdit->addItem(QIcon(":/resources/countries/ky.svg"), "ky");
countryEdit->addItem(QIcon(":/resources/countries/kz.svg"), "kz");
countryEdit->addItem(QIcon(":/resources/countries/la.svg"), "la");
countryEdit->addItem(QIcon(":/resources/countries/lb.svg"), "lb");
countryEdit->addItem(QIcon(":/resources/countries/lc.svg"), "lc");
countryEdit->addItem(QIcon(":/resources/countries/li.svg"), "li");
countryEdit->addItem(QIcon(":/resources/countries/lk.svg"), "lk");
countryEdit->addItem(QIcon(":/resources/countries/lr.svg"), "lr");
countryEdit->addItem(QIcon(":/resources/countries/ls.svg"), "ls");
countryEdit->addItem(QIcon(":/resources/countries/lt.svg"), "lt");
countryEdit->addItem(QIcon(":/resources/countries/lu.svg"), "lu");
countryEdit->addItem(QIcon(":/resources/countries/lv.svg"), "lv");
countryEdit->addItem(QIcon(":/resources/countries/ly.svg"), "ly");
countryEdit->addItem(QIcon(":/resources/countries/ma.svg"), "ma");
countryEdit->addItem(QIcon(":/resources/countries/mc.svg"), "mc");
countryEdit->addItem(QIcon(":/resources/countries/md.svg"), "md");
countryEdit->addItem(QIcon(":/resources/countries/me.svg"), "me");
countryEdit->addItem(QIcon(":/resources/countries/mf.svg"), "mf");
countryEdit->addItem(QIcon(":/resources/countries/mg.svg"), "mg");
countryEdit->addItem(QIcon(":/resources/countries/mh.svg"), "mh");
countryEdit->addItem(QIcon(":/resources/countries/mk.svg"), "mk");
countryEdit->addItem(QIcon(":/resources/countries/ml.svg"), "ml");
countryEdit->addItem(QIcon(":/resources/countries/mm.svg"), "mm");
countryEdit->addItem(QIcon(":/resources/countries/mn.svg"), "mn");
countryEdit->addItem(QIcon(":/resources/countries/mo.svg"), "mo");
countryEdit->addItem(QIcon(":/resources/countries/mp.svg"), "mp");
countryEdit->addItem(QIcon(":/resources/countries/mq.svg"), "mq");
countryEdit->addItem(QIcon(":/resources/countries/mr.svg"), "mr");
countryEdit->addItem(QIcon(":/resources/countries/ms.svg"), "ms");
countryEdit->addItem(QIcon(":/resources/countries/mt.svg"), "mt");
countryEdit->addItem(QIcon(":/resources/countries/mu.svg"), "mu");
countryEdit->addItem(QIcon(":/resources/countries/mv.svg"), "mv");
countryEdit->addItem(QIcon(":/resources/countries/mw.svg"), "mw");
countryEdit->addItem(QIcon(":/resources/countries/mx.svg"), "mx");
countryEdit->addItem(QIcon(":/resources/countries/my.svg"), "my");
countryEdit->addItem(QIcon(":/resources/countries/mz.svg"), "mz");
countryEdit->addItem(QIcon(":/resources/countries/na.svg"), "na");
countryEdit->addItem(QIcon(":/resources/countries/nc.svg"), "nc");
countryEdit->addItem(QIcon(":/resources/countries/ne.svg"), "ne");
countryEdit->addItem(QIcon(":/resources/countries/nf.svg"), "nf");
countryEdit->addItem(QIcon(":/resources/countries/ng.svg"), "ng");
countryEdit->addItem(QIcon(":/resources/countries/ni.svg"), "ni");
countryEdit->addItem(QIcon(":/resources/countries/nl.svg"), "nl");
countryEdit->addItem(QIcon(":/resources/countries/no.svg"), "no");
countryEdit->addItem(QIcon(":/resources/countries/np.svg"), "np");
countryEdit->addItem(QIcon(":/resources/countries/nr.svg"), "nr");
countryEdit->addItem(QIcon(":/resources/countries/nu.svg"), "nu");
countryEdit->addItem(QIcon(":/resources/countries/nz.svg"), "nz");
countryEdit->addItem(QIcon(":/resources/countries/om.svg"), "om");
countryEdit->addItem(QIcon(":/resources/countries/pa.svg"), "pa");
countryEdit->addItem(QIcon(":/resources/countries/pe.svg"), "pe");
countryEdit->addItem(QIcon(":/resources/countries/pf.svg"), "pf");
countryEdit->addItem(QIcon(":/resources/countries/pg.svg"), "pg");
countryEdit->addItem(QIcon(":/resources/countries/ph.svg"), "ph");
countryEdit->addItem(QIcon(":/resources/countries/pk.svg"), "pk");
countryEdit->addItem(QIcon(":/resources/countries/pl.svg"), "pl");
countryEdit->addItem(QIcon(":/resources/countries/pm.svg"), "pm");
countryEdit->addItem(QIcon(":/resources/countries/pn.svg"), "pn");
countryEdit->addItem(QIcon(":/resources/countries/pr.svg"), "pr");
countryEdit->addItem(QIcon(":/resources/countries/ps.svg"), "ps");
countryEdit->addItem(QIcon(":/resources/countries/pt.svg"), "pt");
countryEdit->addItem(QIcon(":/resources/countries/pw.svg"), "pw");
countryEdit->addItem(QIcon(":/resources/countries/py.svg"), "py");
countryEdit->addItem(QIcon(":/resources/countries/qa.svg"), "qa");
countryEdit->addItem(QIcon(":/resources/countries/re.svg"), "re");
countryEdit->addItem(QIcon(":/resources/countries/ro.svg"), "ro");
countryEdit->addItem(QIcon(":/resources/countries/rs.svg"), "rs");
countryEdit->addItem(QIcon(":/resources/countries/ru.svg"), "ru");
countryEdit->addItem(QIcon(":/resources/countries/rw.svg"), "rw");
countryEdit->addItem(QIcon(":/resources/countries/sa.svg"), "sa");
countryEdit->addItem(QIcon(":/resources/countries/sb.svg"), "sb");
countryEdit->addItem(QIcon(":/resources/countries/sc.svg"), "sc");
countryEdit->addItem(QIcon(":/resources/countries/sd.svg"), "sd");
countryEdit->addItem(QIcon(":/resources/countries/se.svg"), "se");
countryEdit->addItem(QIcon(":/resources/countries/sg.svg"), "sg");
countryEdit->addItem(QIcon(":/resources/countries/sh.svg"), "sh");
countryEdit->addItem(QIcon(":/resources/countries/si.svg"), "si");
countryEdit->addItem(QIcon(":/resources/countries/sj.svg"), "sj");
countryEdit->addItem(QIcon(":/resources/countries/sk.svg"), "sk");
countryEdit->addItem(QIcon(":/resources/countries/sl.svg"), "sl");
countryEdit->addItem(QIcon(":/resources/countries/sm.svg"), "sm");
countryEdit->addItem(QIcon(":/resources/countries/sn.svg"), "sn");
countryEdit->addItem(QIcon(":/resources/countries/so.svg"), "so");
countryEdit->addItem(QIcon(":/resources/countries/sr.svg"), "sr");
countryEdit->addItem(QIcon(":/resources/countries/ss.svg"), "ss");
countryEdit->addItem(QIcon(":/resources/countries/st.svg"), "st");
countryEdit->addItem(QIcon(":/resources/countries/sv.svg"), "sv");
countryEdit->addItem(QIcon(":/resources/countries/sx.svg"), "sx");
countryEdit->addItem(QIcon(":/resources/countries/sy.svg"), "sy");
countryEdit->addItem(QIcon(":/resources/countries/sz.svg"), "sz");
countryEdit->addItem(QIcon(":/resources/countries/tc.svg"), "tc");
countryEdit->addItem(QIcon(":/resources/countries/td.svg"), "td");
countryEdit->addItem(QIcon(":/resources/countries/tf.svg"), "tf");
countryEdit->addItem(QIcon(":/resources/countries/tg.svg"), "tg");
countryEdit->addItem(QIcon(":/resources/countries/th.svg"), "th");
countryEdit->addItem(QIcon(":/resources/countries/tj.svg"), "tj");
countryEdit->addItem(QIcon(":/resources/countries/tk.svg"), "tk");
countryEdit->addItem(QIcon(":/resources/countries/tl.svg"), "tl");
countryEdit->addItem(QIcon(":/resources/countries/tm.svg"), "tm");
countryEdit->addItem(QIcon(":/resources/countries/tn.svg"), "tn");
countryEdit->addItem(QIcon(":/resources/countries/to.svg"), "to");
countryEdit->addItem(QIcon(":/resources/countries/tr.svg"), "tr");
countryEdit->addItem(QIcon(":/resources/countries/tt.svg"), "tt");
countryEdit->addItem(QIcon(":/resources/countries/tv.svg"), "tv");
countryEdit->addItem(QIcon(":/resources/countries/tw.svg"), "tw");
countryEdit->addItem(QIcon(":/resources/countries/tz.svg"), "tz");
countryEdit->addItem(QIcon(":/resources/countries/ua.svg"), "ua");
countryEdit->addItem(QIcon(":/resources/countries/ug.svg"), "ug");
countryEdit->addItem(QIcon(":/resources/countries/um.svg"), "um");
countryEdit->addItem(QIcon(":/resources/countries/us.svg"), "us");
countryEdit->addItem(QIcon(":/resources/countries/uy.svg"), "uy");
countryEdit->addItem(QIcon(":/resources/countries/uz.svg"), "uz");
countryEdit->addItem(QIcon(":/resources/countries/va.svg"), "va");
countryEdit->addItem(QIcon(":/resources/countries/vc.svg"), "vc");
countryEdit->addItem(QIcon(":/resources/countries/ve.svg"), "ve");
countryEdit->addItem(QIcon(":/resources/countries/vg.svg"), "vg");
countryEdit->addItem(QIcon(":/resources/countries/vi.svg"), "vi");
countryEdit->addItem(QIcon(":/resources/countries/vn.svg"), "vn");
countryEdit->addItem(QIcon(":/resources/countries/vu.svg"), "vu");
countryEdit->addItem(QIcon(":/resources/countries/wf.svg"), "wf");
countryEdit->addItem(QIcon(":/resources/countries/ws.svg"), "ws");
countryEdit->addItem(QIcon(":/resources/countries/ye.svg"), "ye");
countryEdit->addItem(QIcon(":/resources/countries/yt.svg"), "yt");
countryEdit->addItem(QIcon(":/resources/countries/za.svg"), "za");
countryEdit->addItem(QIcon(":/resources/countries/zm.svg"), "zm");
countryEdit->addItem(QIcon(":/resources/countries/zw.svg"), "zw");
countryEdit->setCurrentIndex(0);
realnameLabel = new QLabel(tr("Real name:"));
realnameEdit = new QLineEdit();
realnameLabel->setBuddy(realnameEdit);
QGridLayout *grid = new QGridLayout;
grid->addWidget(hostLabel, 0, 0);
grid->addWidget(hostEdit, 0, 1);
grid->addWidget(portLabel, 1, 0);
grid->addWidget(portEdit, 1, 1);
grid->addWidget(playernameLabel, 2, 0);
grid->addWidget(playernameEdit, 2, 1);
grid->addWidget(passwordLabel, 3, 0);
grid->addWidget(passwordEdit, 3, 1);
grid->addWidget(emailLabel, 4, 0);
grid->addWidget(emailEdit, 4, 1);
grid->addWidget(genderLabel, 5, 0);
grid->addWidget(genderEdit, 5, 1);
grid->addWidget(countryLabel, 6, 0);
grid->addWidget(countryEdit, 6, 1);
grid->addWidget(realnameLabel, 7, 0);
grid->addWidget(realnameEdit, 7, 1);
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel);
connect(buttonBox, SIGNAL(accepted()), this, SLOT(actOk()));
connect(buttonBox, SIGNAL(rejected()), this, SLOT(actCancel()));
QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addLayout(grid);
mainLayout->addWidget(buttonBox);
setLayout(mainLayout);
setWindowTitle(tr("Register to server"));
setFixedHeight(sizeHint().height());
setMinimumWidth(300);
}
void DlgRegister::actOk()
{
QSettings settings;
settings.beginGroup("server");
settings.setValue("hostname", hostEdit->text());
settings.setValue("port", portEdit->text());
settings.setValue("playername", playernameEdit->text());
// always save the password so it will be picked up by the connect dialog
settings.setValue("password", passwordEdit->text());
settings.endGroup();
accept();
}
void DlgRegister::actCancel()
{
reject();
}

View file

@ -0,0 +1,33 @@
#ifndef DLG_REGISTER_H
#define DLG_REGISTER_H
#include <QDialog>
#include <QLineEdit>
#include <QComboBox>
class QLabel;
class QPushButton;
class QCheckBox;
class DlgRegister : public QDialog {
Q_OBJECT
public:
DlgRegister(QWidget *parent = 0);
QString getHost() const { return hostEdit->text(); }
int getPort() const { return portEdit->text().toInt(); }
QString getPlayerName() const { return playernameEdit->text(); }
QString getPassword() const { return passwordEdit->text(); }
QString getEmail() const { return emailEdit->text(); }
int getGender() const { return genderEdit->currentIndex() - 1; }
QString getCountry() const { return genderEdit->currentIndex() == 0 ? "" : countryEdit->currentText(); }
QString getRealName() const { return realnameEdit->text(); }
private slots:
void actOk();
void actCancel();
private:
QLabel *hostLabel, *portLabel, *playernameLabel, *passwordLabel, *emailLabel, *genderLabel, *countryLabel, *realnameLabel;
QLineEdit *hostEdit, *portEdit, *playernameEdit, *passwordEdit, *emailEdit, *realnameEdit;
QComboBox *genderEdit, *countryEdit;
};
#endif

View file

@ -6,6 +6,8 @@
#include "pb/commands.pb.h"
#include "pb/session_commands.pb.h"
#include "pb/response_login.pb.h"
#include "pb/response_register.pb.h"
#include "pb/response_activate.pb.h"
#include "pb/server_message.pb.h"
#include "pb/event_server_identification.pb.h"
@ -28,6 +30,8 @@ RemoteClient::RemoteClient(QObject *parent)
connect(this, SIGNAL(connectionClosedEventReceived(Event_ConnectionClosed)), this, SLOT(processConnectionClosedEvent(Event_ConnectionClosed)));
connect(this, SIGNAL(sigConnectToServer(QString, unsigned int, QString, QString)), this, SLOT(doConnectToServer(QString, unsigned int, QString, QString)));
connect(this, SIGNAL(sigDisconnectFromServer()), this, SLOT(doDisconnectFromServer()));
connect(this, SIGNAL(sigRegisterToServer(QString, unsigned int, QString, QString, QString, int, QString, QString)), this, SLOT(doRegisterToServer(QString, unsigned int, QString, QString, QString, int, QString, QString)));
connect(this, SIGNAL(sigActivateToServer(QString)), this, SLOT(doActivateToServer(QString)));
}
RemoteClient::~RemoteClient()
@ -52,8 +56,6 @@ void RemoteClient::slotConnected()
sendCommandContainer(CommandContainer());
getNewCmdId();
// end of hack
setStatus(StatusAwaitingWelcome);
}
void RemoteClient::processServerIdentificationEvent(const Event_ServerIdentification &event)
@ -63,6 +65,42 @@ void RemoteClient::processServerIdentificationEvent(const Event_ServerIdentifica
setStatus(StatusDisconnecting);
return;
}
if(getStatus() == StatusRegistering)
{
Command_Register cmdRegister;
cmdRegister.set_user_name(userName.toStdString());
cmdRegister.set_password(password.toStdString());
cmdRegister.set_email(email.toStdString());
cmdRegister.set_gender((ServerInfo_User_Gender) gender);
cmdRegister.set_country(country.toStdString());
cmdRegister.set_real_name(realName.toStdString());
PendingCommand *pend = prepareSessionCommand(cmdRegister);
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(registerResponse(Response)));
sendCommand(pend);
return;
}
if(getStatus() == StatusActivating)
{
Command_Activate cmdActivate;
cmdActivate.set_user_name(userName.toStdString());
cmdActivate.set_token(token.toStdString());
PendingCommand *pend = prepareSessionCommand(cmdActivate);
connect(pend, SIGNAL(finished(Response, CommandContainer, QVariant)), this, SLOT(activateResponse(Response)));
sendCommand(pend);
return;
}
doLogin();
}
void RemoteClient::doLogin()
{
setStatus(StatusLoggingIn);
Command_Login cmdLogin;
@ -101,6 +139,38 @@ void RemoteClient::loginResponse(const Response &response)
}
}
void RemoteClient::registerResponse(const Response &response)
{
const Response_Register &resp = response.GetExtension(Response_Register::ext);
switch(response.response_code())
{
case Response::RespRegistrationAccepted:
emit registerAccepted();
doLogin();
break;
case Response::RespRegistrationAcceptedNeedsActivation:
emit registerAcceptedNeedsActivate();
doLogin();
break;
default:
emit registerError(response.response_code(), QString::fromStdString(resp.denied_reason_str()), resp.denied_end_time());
setStatus(StatusDisconnecting);
doDisconnectFromServer();
break;
}
}
void RemoteClient::activateResponse(const Response &response)
{
if (response.response_code() == Response::RespActivationAccepted) {
emit activateAccepted();
doLogin();
} else {
emit activateError();
}
}
void RemoteClient::readData()
{
lastDataReceived = timeRunning;
@ -171,10 +241,40 @@ void RemoteClient::doConnectToServer(const QString &hostname, unsigned int port,
userName = _userName;
password = _password;
lastHostname = hostname;
lastPort = port;
socket->connectToHost(hostname, port);
setStatus(StatusConnecting);
}
void RemoteClient::doRegisterToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password, const QString &_email, const int _gender, const QString &_country, const QString &_realname)
{
doDisconnectFromServer();
userName = _userName;
password = _password;
email = _email;
gender = _gender;
country = _country;
realName = _realname;
lastHostname = hostname;
lastPort = port;
socket->connectToHost(hostname, port);
setStatus(StatusRegistering);
}
void RemoteClient::doActivateToServer(const QString &_token)
{
doDisconnectFromServer();
token = _token;
socket->connectToHost(lastHostname, lastPort);
setStatus(StatusActivating);
}
void RemoteClient::doDisconnectFromServer()
{
timer->stop();
@ -225,6 +325,16 @@ void RemoteClient::connectToServer(const QString &hostname, unsigned int port, c
emit sigConnectToServer(hostname, port, _userName, _password);
}
void RemoteClient::registerToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password, const QString &_email, const int _gender, const QString &_country, const QString &_realname)
{
emit sigRegisterToServer(hostname, port, _userName, _password, _email, _gender, _country, _realname);
}
void RemoteClient::activateToServer(const QString &_token)
{
emit sigActivateToServer(_token);
}
void RemoteClient::disconnectFromServer()
{
emit sigDisconnectFromServer();

View file

@ -12,10 +12,14 @@ signals:
void maxPingTime(int seconds, int maxSeconds);
void serverTimeout();
void loginError(Response::ResponseCode resp, QString reasonStr, quint32 endTime);
void registerError(Response::ResponseCode resp, QString reasonStr, quint32 endTime);
void activateError();
void socketError(const QString &errorString);
void protocolVersionMismatch(int clientVersion, int serverVersion);
void protocolError();
void sigConnectToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password);
void sigRegisterToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password, const QString &_email, const int _gender, const QString &_country, const QString &_realname);
void sigActivateToServer(const QString &_token);
void sigDisconnectFromServer();
private slots:
void slotConnected();
@ -25,8 +29,14 @@ private slots:
void processServerIdentificationEvent(const Event_ServerIdentification &event);
void processConnectionClosedEvent(const Event_ConnectionClosed &event);
void loginResponse(const Response &response);
void registerResponse(const Response &response);
void activateResponse(const Response &response);
void doConnectToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password);
void doRegisterToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password, const QString &_email, const int _gender, const QString &_country, const QString &_realname);
void doLogin();
void doDisconnectFromServer();
void doActivateToServer(const QString &_token);
private:
static const int maxTimeout = 10;
int timeRunning, lastDataReceived;
@ -38,6 +48,8 @@ private:
QTimer *timer;
QTcpSocket *socket;
QString lastHostname;
int lastPort;
protected slots:
void sendCommandContainer(const CommandContainer &cont);
public:
@ -45,6 +57,8 @@ public:
~RemoteClient();
QString peerName() const { return socket->peerName(); }
void connectToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password);
void registerToServer(const QString &hostname, unsigned int port, const QString &_userName, const QString &_password, const QString &_email, const int _gender, const QString &_country, const QString &_realname);
void activateToServer(const QString &_token);
void disconnectFromServer();
};

View file

@ -34,6 +34,7 @@
#include "main.h"
#include "window_main.h"
#include "dlg_connect.h"
#include "dlg_register.h"
#include "dlg_settings.h"
#include "tab_supervisor.h"
#include "remoteclient.h"
@ -97,21 +98,22 @@ void MainWindow::statusChanged(ClientStatus _status)
{
setClientStatusTitle();
switch (_status) {
case StatusConnecting:
break;
case StatusDisconnected:
tabSupervisor->stop();
aSinglePlayer->setEnabled(true);
aConnect->setEnabled(true);
aRegister->setEnabled(true);
aDisconnect->setEnabled(false);
break;
case StatusLoggingIn:
aSinglePlayer->setEnabled(false);
aConnect->setEnabled(false);
aRegister->setEnabled(false);
aDisconnect->setEnabled(true);
break;
case StatusConnecting:
case StatusRegistering:
case StatusLoggedIn:
break;
default:
break;
}
@ -122,6 +124,21 @@ void MainWindow::userInfoReceived(const ServerInfo_User &info)
tabSupervisor->start(info);
}
void MainWindow::registerAccepted()
{
QMessageBox::information(this, tr("Success"), tr("Registration accepted.\nWill now login."));
}
void MainWindow::registerAcceptedNeedsActivate()
{
// nothing
}
void MainWindow::activateAccepted()
{
QMessageBox::information(this, tr("Success"), tr("Account activation accepted.\nWill now login."));
}
// Actions
void MainWindow::actConnect()
@ -131,6 +148,24 @@ void MainWindow::actConnect()
client->connectToServer(dlg.getHost(), dlg.getPort(), dlg.getPlayerName(), dlg.getPassword());
}
void MainWindow::actRegister()
{
DlgRegister dlg(this);
if (dlg.exec())
{
client->registerToServer(
dlg.getHost(),
dlg.getPort(),
dlg.getPlayerName(),
dlg.getPassword(),
dlg.getEmail(),
dlg.getGender(),
dlg.getCountry(),
dlg.getRealName()
);
}
}
void MainWindow::actDisconnect()
{
client->disconnectFromServer();
@ -144,6 +179,7 @@ void MainWindow::actSinglePlayer()
return;
aConnect->setEnabled(false);
aRegister->setEnabled(false);
aSinglePlayer->setEnabled(false);
localServer = new LocalServer(this);
@ -191,6 +227,7 @@ void MainWindow::localGameEnded()
localServer = 0;
aConnect->setEnabled(true);
aRegister->setEnabled(true);
aSinglePlayer->setEnabled(true);
}
@ -269,11 +306,74 @@ void MainWindow::loginError(Response::ResponseCode r, QString reasonStr, quint32
QMessageBox::critical(this, tr("Error"), tr("Invalid username.\nYou may only use A-Z, a-z, 0-9, _, ., and - in your username."));
break;
case Response::RespRegistrationRequired:
QMessageBox::critical(this, tr("Error"), tr("This server requires user registration."));
if (QMessageBox::question(this, tr("Error"), tr("This server requires user registration. Do you want to register now?"), QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) {
actRegister();
}
break;
case Response::RespAccountNotActivated: {
bool ok = false;
QString token = QInputDialog::getText(this, tr("Account activation"), tr("Your account has not been activated yet.\n You need to provide the activation token received in the activation email"), QLineEdit::Normal, QString(), &ok);
if(ok && !token.isEmpty())
{
client->activateToServer(token);
return;
}
client->disconnectFromServer();
break;
}
default:
QMessageBox::critical(this, tr("Error"), tr("Unknown login error: %1").arg(static_cast<int>(r)));
break;
}
actConnect();
}
void MainWindow::registerError(Response::ResponseCode r, QString reasonStr, quint32 endTime)
{
switch (r) {
case Response::RespRegistrationDisabled:
QMessageBox::critical(this, tr("Registration denied"), tr("Registration is currently disabled on this server"));
break;
case Response::RespUserAlreadyExists:
QMessageBox::critical(this, tr("Registration denied"), tr("There is already an existing account with the same user name."));
break;
case Response::RespEmailRequiredToRegister:
QMessageBox::critical(this, tr("Registration denied"), tr("It's mandatory to specify a valid email address when registering."));
break;
case Response::RespTooManyRequests:
QMessageBox::critical(this, tr("Registration denied"), tr("Too many registration attempts from your IP address."));
break;
case Response::RespPasswordTooShort:
QMessageBox::critical(this, tr("Registration denied"), tr("Password too short."));
break;
case Response::RespUserIsBanned: {
QString bannedStr;
if (endTime)
bannedStr = tr("You are banned until %1.").arg(QDateTime::fromTime_t(endTime).toString());
else
bannedStr = tr("You are banned indefinitely.");
if (!reasonStr.isEmpty())
bannedStr.append("\n\n" + reasonStr);
QMessageBox::critical(this, tr("Error"), bannedStr);
break;
}
case Response::RespUsernameInvalid:
QMessageBox::critical(this, tr("Error"), tr("Invalid username.\nYou may only use A-Z, a-z, 0-9, _, ., and - in your username."));
break;
case Response::RespRegistrationFailed:
QMessageBox::critical(this, tr("Error"), tr("Registration failed for a technical problem on the server."));
break;
default:
QMessageBox::critical(this, tr("Error"), tr("Unknown login error: %1").arg(static_cast<int>(r)));
}
actRegister();
}
void MainWindow::activateError()
{
QMessageBox::critical(this, tr("Error"), tr("Account activation failed"));
client->disconnectFromServer();
actConnect();
}
@ -295,6 +395,7 @@ void MainWindow::setClientStatusTitle()
{
switch (client->getStatus()) {
case StatusConnecting: setWindowTitle(appName + " - " + tr("Connecting to %1...").arg(client->peerName())); break;
case StatusRegistering: setWindowTitle(appName + " - " + tr("Registering to %1 as %2...").arg(client->peerName()).arg(client->getUserName())); break;
case StatusDisconnected: setWindowTitle(appName + " - " + tr("Disconnected")); break;
case StatusLoggingIn: setWindowTitle(appName + " - " + tr("Connected, logging in at %1").arg(client->peerName())); break;
case StatusLoggedIn: setWindowTitle(appName + " - " + tr("Logged in as %1 at %2").arg(client->getUserName()).arg(client->peerName())); break;
@ -313,6 +414,7 @@ void MainWindow::retranslateUi()
aDeckEditor->setText(tr("&Deck editor"));
aFullScreen->setText(tr("&Full screen"));
aFullScreen->setShortcut(QKeySequence("Ctrl+F"));
aRegister->setText(tr("&Register to server..."));
aSettings->setText(tr("&Settings..."));
aExit->setText(tr("&Exit"));
@ -344,6 +446,8 @@ void MainWindow::createActions()
aFullScreen = new QAction(this);
aFullScreen->setCheckable(true);
connect(aFullScreen, SIGNAL(toggled(bool)), this, SLOT(actFullScreen(bool)));
aRegister = new QAction(this);
connect(aRegister, SIGNAL(triggered()), this, SLOT(actRegister()));
aSettings = new QAction(this);
connect(aSettings, SIGNAL(triggered()), this, SLOT(actSettings()));
aExit = new QAction(this);
@ -376,6 +480,7 @@ void MainWindow::createMenus()
cockatriceMenu = menuBar()->addMenu(QString());
cockatriceMenu->addAction(aConnect);
cockatriceMenu->addAction(aDisconnect);
cockatriceMenu->addAction(aRegister);
cockatriceMenu->addSeparator();
cockatriceMenu->addAction(aSinglePlayer);
cockatriceMenu->addAction(aWatchReplay);
@ -408,7 +513,13 @@ MainWindow::MainWindow(QWidget *parent)
connect(client, SIGNAL(statusChanged(ClientStatus)), this, SLOT(statusChanged(ClientStatus)));
connect(client, SIGNAL(protocolVersionMismatch(int, int)), this, SLOT(protocolVersionMismatch(int, int)));
connect(client, SIGNAL(userInfoChanged(const ServerInfo_User &)), this, SLOT(userInfoReceived(const ServerInfo_User &)), Qt::BlockingQueuedConnection);
connect(client, SIGNAL(registerAccepted()), this, SLOT(registerAccepted()));
connect(client, SIGNAL(registerAcceptedNeedsActivate()), this, SLOT(registerAcceptedNeedsActivate()));
connect(client, SIGNAL(registerError(Response::ResponseCode, QString, quint32)), this, SLOT(registerError(Response::ResponseCode, QString, quint32)));
connect(client, SIGNAL(activateAccepted()), this, SLOT(activateAccepted()));
connect(client, SIGNAL(activateError()), this, SLOT(activateError()));
clientThread = new QThread(this);
client->moveToThread(clientThread);
clientThread->start();

View file

@ -43,9 +43,14 @@ private slots:
void processServerShutdownEvent(const Event_ServerShutdown &event);
void serverTimeout();
void loginError(Response::ResponseCode r, QString reasonStr, quint32 endTime);
void registerError(Response::ResponseCode r, QString reasonStr, quint32 endTime);
void activateError();
void socketError(const QString &errorStr);
void protocolVersionMismatch(int localVersion, int remoteVersion);
void userInfoReceived(const ServerInfo_User &userInfo);
void registerAccepted();
void registerAcceptedNeedsActivate();
void activateAccepted();
void localGameEnded();
void pixmapCacheSizeChanged(int newSizeInMBs);
@ -55,6 +60,7 @@ private slots:
void actWatchReplay();
void actDeckEditor();
void actFullScreen(bool checked);
void actRegister();
void actSettings();
void actExit();
@ -82,7 +88,7 @@ private:
QList<QMenu *> tabMenus;
QMenu *cockatriceMenu, *helpMenu;
QAction *aConnect, *aDisconnect, *aSinglePlayer, *aWatchReplay, *aDeckEditor, *aFullScreen, *aSettings, *aExit,
*aAbout, *aCheckCardUpdates;
*aAbout, *aCheckCardUpdates, *aRegister;
TabSupervisor *tabSupervisor;
QMenu *trayIconMenu;