Skip to content

Commit

Permalink
Merge branch 'kitsune-create-room'
Browse files Browse the repository at this point in the history
Closes #34.
  • Loading branch information
KitsuneRal committed Jan 30, 2018
2 parents 7554238 + 86c41b9 commit 0aade6a
Show file tree
Hide file tree
Showing 6 changed files with 94 additions and 23 deletions.
38 changes: 33 additions & 5 deletions connection.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "jobs/generated/login.h"
#include "jobs/generated/logout.h"
#include "jobs/generated/receipts.h"
#include "jobs/generated/leaving.h"
#include "jobs/sendeventjob.h"
#include "jobs/joinroomjob.h"
#include "jobs/roommessagesjob.h"
Expand Down Expand Up @@ -61,7 +62,7 @@ class Connection::Private
// Leave state of the same room.
QHash<QPair<QString, bool>, Room*> roomMap;
QVector<QString> roomIdsToForget;
QHash<QString, User*> userMap;
QMap<QString, User*> userMap;
QString userId;

SyncJob* syncJob = nullptr;
Expand Down Expand Up @@ -385,6 +386,27 @@ DownloadFileJob* Connection::downloadFile(const QUrl& url,
return job;
}

CreateRoomJob* Connection::createRoom(RoomVisibility visibility,
const QString& alias, const QString& name, const QString& topic,
const QVector<QString>& invites, const QString& presetName,
bool isDirect, bool guestsCanJoin,
const QVector<CreateRoomJob::StateEvent>& initialState,
const QVector<CreateRoomJob::Invite3pid>& invite3pids,
const QJsonObject creationContent)
{
return callApi<CreateRoomJob>(
visibility == PublishRoom ? "public" : "private", alias, name,
topic, invites, invite3pids, creationContent, initialState,
presetName, isDirect, guestsCanJoin);
}

CreateRoomJob* Connection::createDirectChat(const QString& userId,
const QString& topic, const QString& name)
{
return createRoom(UnpublishRoom, "", name, topic, {userId},
"trusted_private_chat", true);
}

ForgetRoomJob* Connection::forgetRoom(const QString& id)
{
// To forget is hard :) First we should ensure the local user is not
Expand Down Expand Up @@ -437,8 +459,9 @@ User* Connection::user(const QString& userId)
{
if( d->userMap.contains(userId) )
return d->userMap.value(userId);
auto* user = createUser(this, userId);
auto* user = userFactory(this, userId);
d->userMap.insert(userId, user);
emit newUser(user);
return user;
}

Expand Down Expand Up @@ -493,6 +516,11 @@ QHash< QPair<QString, bool>, Room* > Connection::roomMap() const
return roomMap;
}

QMap<QString, User*> Connection::users() const
{
return d->userMap;
}

const ConnectionData* Connection::connectionData() const
{
return d->data.get();
Expand All @@ -515,7 +543,7 @@ Room* Connection::provideRoom(const QString& id, JoinState joinState)
}
else
{
room = createRoom(this, id, joinState);
room = roomFactory(this, id, joinState);
if (!room)
{
qCCritical(MAIN) << "Failed to create a room" << id;
Expand Down Expand Up @@ -550,11 +578,11 @@ Room* Connection::provideRoom(const QString& id, JoinState joinState)
return room;
}

Connection::room_factory_t Connection::createRoom =
Connection::room_factory_t Connection::roomFactory =
[](Connection* c, const QString& id, JoinState joinState)
{ return new Room(c, id, joinState); };

Connection::user_factory_t Connection::createUser =
Connection::user_factory_t Connection::userFactory =
[](Connection* c, const QString& id) { return new User(id, c); };

QByteArray Connection::generateTxnId()
Expand Down
61 changes: 45 additions & 16 deletions connection.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@

#pragma once

#include "jobs/generated/leaving.h"
#include "jobs/generated/create_room.h"
#include "joinstate.h"

#include <QtCore/QObject>
Expand All @@ -39,6 +39,7 @@ namespace QMatrixClient
class SyncData;
class RoomMessagesJob;
class PostReceiptJob;
class ForgetRoomJob;
class MediaThumbnailJob;
class JoinRoomJob;
class UploadContentJob;
Expand All @@ -51,18 +52,26 @@ namespace QMatrixClient
/** Whether or not the rooms state should be cached locally
* \sa loadState(), saveState()
*/
Q_PROPERTY(User* localUser READ user CONSTANT)
Q_PROPERTY(QString localUserId READ userId CONSTANT)
Q_PROPERTY(QString deviceId READ deviceId CONSTANT)
Q_PROPERTY(QByteArray accessToken READ accessToken CONSTANT)
Q_PROPERTY(QUrl homeserver READ homeserver WRITE setHomeserver NOTIFY homeserverChanged)
Q_PROPERTY(bool cacheState READ cacheState WRITE setCacheState NOTIFY cacheStateChanged)
public:
using room_factory_t =
std::function<Room*(Connection*, const QString&, JoinState joinState)>;
using user_factory_t =
std::function<User*(Connection*, const QString&)>;

enum RoomVisibility { PublishRoom, UnpublishRoom }; // FIXME: Should go inside CreateRoomJob

explicit Connection(QObject* parent = nullptr);
explicit Connection(const QUrl& server, QObject* parent = nullptr);
virtual ~Connection();

QHash<QPair<QString, bool>, Room*> roomMap() const;
QMap<QString, User*> users() const;

/** Sends /forget to the server and also deletes room locally.
* This method is in Connection, not in Room, since it's a
Expand All @@ -80,14 +89,14 @@ namespace QMatrixClient

// FIXME: Convert Q_INVOKABLEs to Q_PROPERTIES
// (breaks back-compatibility)
Q_INVOKABLE QUrl homeserver() const;
QUrl homeserver() const;
Q_INVOKABLE User* user(const QString& userId);
Q_INVOKABLE User* user();
Q_INVOKABLE QString userId() const;
Q_INVOKABLE QString deviceId() const;
User* user();
QString userId() const;
QString deviceId() const;
/** @deprecated Use accessToken() instead. */
Q_INVOKABLE QString token() const;
Q_INVOKABLE QByteArray accessToken() const;
QByteArray accessToken() const;
Q_INVOKABLE SyncJob* syncJob() const;
Q_INVOKABLE int millisToReconnect() const;

Expand Down Expand Up @@ -145,15 +154,15 @@ namespace QMatrixClient
template <typename T = Room>
static void setRoomType()
{
createRoom =
roomFactory =
[](Connection* c, const QString& id, JoinState joinState)
{ return new T(c, id, joinState); };
}

template <typename T = User>
static void setUserType()
{
createUser =
userFactory =
[](Connection* c, const QString& id) { return new T(id, c); };
}

Expand Down Expand Up @@ -186,17 +195,34 @@ namespace QMatrixClient
int requestedHeight) const;

// QIODevice* should already be open
virtual UploadContentJob* uploadContent(QIODevice* contentSource,
UploadContentJob* uploadContent(QIODevice* contentSource,
const QString& filename = {},
const QString& contentType = {}) const;
virtual UploadContentJob* uploadFile(const QString& fileName,
const QString& contentType = {});
virtual GetContentJob* getContent(const QString& mediaId) const;
UploadContentJob* uploadFile(const QString& fileName,
const QString& contentType = {});
GetContentJob* getContent(const QString& mediaId) const;
GetContentJob* getContent(const QUrl& url) const;
// If localFilename is empty, a temporary file will be created
virtual DownloadFileJob* downloadFile(const QUrl& url,
DownloadFileJob* downloadFile(const QUrl& url,
const QString& localFilename = {}) const;

/**
* \brief Create a room (generic method)
* This method allows to customize room entirely to your liking,
* providing all the attributes the original CS API provides.
*/
CreateRoomJob* createRoom(RoomVisibility visibility,
const QString& alias, const QString& name, const QString& topic,
const QVector<QString>& invites, const QString& presetName = {}, bool isDirect = false,
bool guestsCanJoin = false,
const QVector<CreateRoomJob::StateEvent>& initialState = {},
const QVector<CreateRoomJob::Invite3pid>& invite3pids = {},
const QJsonObject creationContent = {});

/** Create a direct chat with a single user, optional name and topic */
CreateRoomJob* createDirectChat(const QString& userId,
const QString& topic = {}, const QString& name = {});

virtual JoinRoomJob* joinRoom(const QString& roomAlias);

// Old API that will be abolished any time soon. DO NOT USE.
Expand Down Expand Up @@ -237,6 +263,8 @@ namespace QMatrixClient
void syncDone();
void syncError(QString error);

void newUser(User* user);

/**
* \group Signals emitted on room transitions
*
Expand Down Expand Up @@ -310,7 +338,7 @@ namespace QMatrixClient
* the server; in particular, does not automatically create rooms
* on the server.
* @return a pointer to a Room object with the specified id; nullptr
* if roomId is empty if createRoom() failed to create a Room object.
* if roomId is empty if roomFactory() failed to create a Room object.
*/
Room* provideRoom(const QString& roomId, JoinState joinState);

Expand Down Expand Up @@ -340,7 +368,8 @@ namespace QMatrixClient
const QString& initialDeviceName,
const QString& deviceId = {});

static room_factory_t createRoom;
static user_factory_t createUser;
static room_factory_t roomFactory;
static user_factory_t userFactory;
};
} // namespace QMatrixClient
Q_DECLARE_METATYPE(QMatrixClient::Connection*)
3 changes: 2 additions & 1 deletion jobs/generated/create_room.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ class CreateRoomJob::Private
QString roomId;
};

CreateRoomJob::CreateRoomJob(const QString& visibility, const QString& roomAliasName, const QString& name, const QString& topic, const QVector<QString>& invite, const QVector<Invite3pid>& invite3pid, const QJsonObject& creationContent, const QVector<StateEvent>& initialState, const QString& preset, bool isDirect)
CreateRoomJob::CreateRoomJob(const QString& visibility, const QString& roomAliasName, const QString& name, const QString& topic, const QVector<QString>& invite, const QVector<Invite3pid>& invite3pid, const QJsonObject& creationContent, const QVector<StateEvent>& initialState, const QString& preset, bool isDirect, bool guestCanJoin)
: BaseJob(HttpVerb::Post, "CreateRoomJob",
basePath % "/createRoom")
, d(new Private)
Expand All @@ -95,6 +95,7 @@ CreateRoomJob::CreateRoomJob(const QString& visibility, const QString& roomAlias
if (!preset.isEmpty())
_data.insert("preset", toJson(preset));
_data.insert("is_direct", toJson(isDirect));
_data.insert("guest_can_join", toJson(guestCanJoin));
setRequestData(_data);
}

Expand Down
2 changes: 1 addition & 1 deletion jobs/generated/create_room.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ namespace QMatrixClient

// End of inner data structures

explicit CreateRoomJob(const QString& visibility = {}, const QString& roomAliasName = {}, const QString& name = {}, const QString& topic = {}, const QVector<QString>& invite = {}, const QVector<Invite3pid>& invite3pid = {}, const QJsonObject& creationContent = {}, const QVector<StateEvent>& initialState = {}, const QString& preset = {}, bool isDirect = {});
explicit CreateRoomJob(const QString& visibility = {}, const QString& roomAliasName = {}, const QString& name = {}, const QString& topic = {}, const QVector<QString>& invite = {}, const QVector<Invite3pid>& invite3pid = {}, const QJsonObject& creationContent = {}, const QVector<StateEvent>& initialState = {}, const QString& preset = {}, bool isDirect = {}, bool guestCanJoin = {});
~CreateRoomJob() override;

const QString& roomId() const;
Expand Down
11 changes: 11 additions & 0 deletions room.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -862,6 +862,17 @@ void Room::postMessage(const RoomMessageEvent& event)
connection()->callApi<SendEventJob>(id(), event);
}

void Room::setName(const QString& newName)
{
connection()->callApi<SetRoomStateJob>(id(), RoomNameEvent(newName));
}

void Room::setCanonicalAlias(const QString& newAlias)
{
connection()->callApi<SetRoomStateJob>(id(),
RoomCanonicalAliasEvent(newAlias));
}

void Room::setTopic(const QString& newTopic)
{
RoomTopicEvent evt(newTopic);
Expand Down
2 changes: 2 additions & 0 deletions room.h
Original file line number Diff line number Diff line change
Expand Up @@ -235,6 +235,8 @@ namespace QMatrixClient
/** @deprecated If you have a custom event type, construct the event
* and pass it as a whole to postMessage() */
void postMessage(const QString& type, const QString& plainText);
void setName(const QString& newName);
void setCanonicalAlias(const QString& newAlias);
void setTopic(const QString& newTopic);

void getPreviousContent(int limit = 10);
Expand Down

0 comments on commit 0aade6a

Please sign in to comment.