From d27d2ab396f92b7d5139f43afe52be6e0470eaea Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Fri, 13 Oct 2017 00:02:46 +0200 Subject: Support banning and unbanning Closes #38. Also rearranged #includes --- room.cpp | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) (limited to 'room.cpp') diff --git a/room.cpp b/room.cpp index 05b16b65..79168d85 100644 --- a/room.cpp +++ b/room.cpp @@ -20,17 +20,8 @@ #include "jobs/generated/kicking.h" #include "jobs/generated/inviting.h" - -#include - -#include -#include // for efficient string concats (operator%) -#include -#include - -#include "connection.h" -#include "state.h" -#include "user.h" +#include "jobs/generated/banning.h" +#include "jobs/setroomstatejob.h" #include "events/roomnameevent.h" #include "events/roomaliasesevent.h" #include "events/roomcanonicalaliasevent.h" @@ -42,6 +33,14 @@ #include "jobs/roommessagesjob.h" #include "jobs/postreceiptjob.h" #include "jobs/leaveroomjob.h" +#include "connection.h" +#include "user.h" + +#include +#include // for efficient string concats (operator%) +#include + +#include using namespace QMatrixClient; @@ -639,6 +638,16 @@ void Room::kickMember(const QString& memberId, const QString& reason) const connection()->callApi(id(), memberId, reason); } +void Room::ban(const QString& userId, const QString& reason) const +{ + connection()->callApi(id(), userId, reason); +} + +void Room::unban(const QString& userId) const +{ + connection()->callApi(id(), userId); +} + void Room::Private::dropDuplicateEvents(RoomEvents* events) const { // Collect all duplicate events at the end of the container -- cgit v1.2.3 From 76c42a9863b83229e6afaf4be32e9582e3d97d3f Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Sat, 14 Oct 2017 01:22:04 +0200 Subject: Cleanup around Room (potentially breaks API compatibility, beware) Notably: * API for SendEventJob and SetRoomStateJob has been altered to accept references, not pointers. * Methods on Room that invoke requests to the server, have lost const, because they may be reflecting the changed state on the fly, within themselves --- connection.cpp | 1 - events/roommemberevent.cpp | 8 +++++--- jobs/sendeventjob.cpp | 2 +- jobs/sendeventjob.h | 4 ++-- jobs/setroomstatejob.h | 8 ++++---- room.cpp | 27 +++++++++++---------------- room.h | 15 ++++++--------- 7 files changed, 29 insertions(+), 36 deletions(-) (limited to 'room.cpp') diff --git a/connection.cpp b/connection.cpp index e20f843f..c7492868 100644 --- a/connection.cpp +++ b/connection.cpp @@ -26,7 +26,6 @@ #include "jobs/sendeventjob.h" #include "jobs/postreceiptjob.h" #include "jobs/joinroomjob.h" -#include "jobs/leaveroomjob.h" #include "jobs/roommessagesjob.h" #include "jobs/syncjob.h" #include "jobs/mediathumbnailjob.h" diff --git a/events/roommemberevent.cpp b/events/roommemberevent.cpp index 5973acc7..19f116d2 100644 --- a/events/roommemberevent.cpp +++ b/events/roommemberevent.cpp @@ -22,6 +22,9 @@ using namespace QMatrixClient; +static const auto membershipStrings = + { "invite", "join", "knock", "leave", "ban" }; + RoomMemberEvent::RoomMemberEvent(const QJsonObject& obj) : RoomEvent(Type::RoomMember, obj), _userId(obj["state_key"].toString()) { @@ -29,11 +32,10 @@ RoomMemberEvent::RoomMemberEvent(const QJsonObject& obj) _displayName = contentObj["displayname"].toString(); _avatarUrl = contentObj["avatar_url"].toString(); QString membershipString = contentObj["membership"].toString(); - const auto supportedStrings = { "invite", "join", "knock", "leave", "ban" }; - for (auto it = supportedStrings.begin(); it != supportedStrings.end(); ++it) + for (auto it = membershipStrings.begin(); it != membershipStrings.end(); ++it) if (membershipString == *it) { - _membership = MembershipType(it - supportedStrings.begin()); + _membership = MembershipType(it - membershipStrings.begin()); return; } qCWarning(EVENTS) << "Unknown MembershipType: " << membershipString; diff --git a/jobs/sendeventjob.cpp b/jobs/sendeventjob.cpp index 7e33e089..f5190d4b 100644 --- a/jobs/sendeventjob.cpp +++ b/jobs/sendeventjob.cpp @@ -24,7 +24,7 @@ using namespace QMatrixClient; SendEventJob::SendEventJob(const QString& roomId, const QString& type, const QString& plainText) - : SendEventJob(roomId, new RoomMessageEvent(plainText, type)) + : SendEventJob(roomId, RoomMessageEvent(plainText, type)) { } void SendEventJob::beforeStart(const ConnectionData* connData) diff --git a/jobs/sendeventjob.h b/jobs/sendeventjob.h index 7b10b3d4..3a11eb6a 100644 --- a/jobs/sendeventjob.h +++ b/jobs/sendeventjob.h @@ -29,12 +29,12 @@ namespace QMatrixClient public: /** Constructs a job that sends an arbitrary room event */ template - SendEventJob(const QString& roomId, const EvT* event) + SendEventJob(const QString& roomId, const EvT& event) : BaseJob(HttpVerb::Put, QStringLiteral("SendEventJob"), QStringLiteral("_matrix/client/r0/rooms/%1/send/%2/") .arg(roomId, EvT::TypeId), // See also beforeStart() Query(), - Data(event->toJson())) + Data(event.toJson())) { } /** diff --git a/jobs/setroomstatejob.h b/jobs/setroomstatejob.h index ddc271b9..b7e6d4a1 100644 --- a/jobs/setroomstatejob.h +++ b/jobs/setroomstatejob.h @@ -33,24 +33,24 @@ namespace QMatrixClient */ template SetRoomStateJob(const QString& roomId, const QString& stateKey, - const EvT* event) + const EvT& event) : BaseJob(HttpVerb::Put, "SetRoomStateJob", QStringLiteral("_matrix/client/r0/rooms/%1/state/%2/%3") .arg(roomId, EvT::TypeId, stateKey), Query(), - Data(event->toJson())) + Data(event.toJson())) { } /** * Constructs a job that sets a state using an arbitrary room event * without a state key. */ template - SetRoomStateJob(const QString& roomId, const EvT* event) + SetRoomStateJob(const QString& roomId, const EvT& event) : BaseJob(HttpVerb::Put, "SetRoomStateJob", QStringLiteral("_matrix/client/r0/rooms/%1/state/%2") .arg(roomId, EvT::TypeId), Query(), - Data(event->toJson())) + Data(event.toJson())) { } QString eventId() const { return _eventId; } diff --git a/room.cpp b/room.cpp index 79168d85..53d8fef1 100644 --- a/room.cpp +++ b/room.cpp @@ -445,7 +445,8 @@ void Room::Private::addMember(User *u) if (!hasMember(u)) { insertMemberIntoMap(u); - connect(u, &User::nameChanged, q, &Room::userRenamed); + connect(u, &User::nameChanged, q, + [=] (User* u, const QString& newName) { renameMember(u, newName); }); emit q->userAdded(u); } } @@ -490,11 +491,6 @@ void Room::Private::removeMember(User* u) } } -void Room::userRenamed(User* user, QString oldName) -{ - d->renameMember(user, std::move(oldName)); -} - QString Room::roomMembername(User *u) const { // See the CS spec, section 11.2.2.3 @@ -581,16 +577,15 @@ void Room::updateData(SyncRoomData&& data) void Room::postMessage(const QString& type, const QString& plainText) { - connection()->callApi(id(), type, plainText); + postMessage(RoomMessageEvent { plainText, type }); } void Room::postMessage(const QString& plainText, MessageEventType type) { - RoomMessageEvent rme(plainText, type); - postMessage(&rme); + postMessage(RoomMessageEvent { plainText, type }); } -void Room::postMessage(RoomMessageEvent* event) +void Room::postMessage(const RoomMessageEvent& event) { connection()->callApi(id(), event); } @@ -598,7 +593,7 @@ void Room::postMessage(RoomMessageEvent* event) void Room::setTopic(const QString& newTopic) { RoomTopicEvent evt(newTopic); - connection()->callApi(id(), &evt); + connection()->callApi(id(), evt); } void Room::getPreviousContent(int limit) @@ -623,27 +618,27 @@ void Room::Private::getPreviousContent(int limit) } } -void Room::inviteToRoom(const QString& memberId) const +void Room::inviteToRoom(const QString& memberId) { connection()->callApi(id(), memberId); } -void Room::leaveRoom() const +void Room::leaveRoom() { connection()->callApi(id()); } -void Room::kickMember(const QString& memberId, const QString& reason) const +void Room::kickMember(const QString& memberId, const QString& reason) { connection()->callApi(id(), memberId, reason); } -void Room::ban(const QString& userId, const QString& reason) const +void Room::ban(const QString& userId, const QString& reason) { connection()->callApi(id(), userId, reason); } -void Room::unban(const QString& userId) const +void Room::unban(const QString& userId) { connection()->callApi(id(), userId); } diff --git a/room.h b/room.h index d62d160f..00d4c333 100644 --- a/room.h +++ b/room.h @@ -150,21 +150,18 @@ namespace QMatrixClient public slots: void postMessage(const QString& plainText, MessageEventType type = MessageEventType::Text); - void postMessage(RoomMessageEvent* event); + void postMessage(const RoomMessageEvent& event); /** @deprecated */ void postMessage(const QString& type, const QString& plainText); void setTopic(const QString& newTopic); void getPreviousContent(int limit = 10); - void inviteToRoom(const QString& memberId) const; - void leaveRoom() const; - void kickMember(const QString& memberId, - const QString& reason = {}) const; - void ban(const QString& userId, const QString& reason = {}) const; - void unban(const QString& userId) const; - - void userRenamed(User* user, QString oldName); + void inviteToRoom(const QString& memberId); + void leaveRoom(); + void kickMember(const QString& memberId, const QString& reason = {}); + void ban(const QString& userId, const QString& reason = {}); + void unban(const QString& userId); /** Mark all messages in the room as read */ void markAllMessagesAsRead(); -- cgit v1.2.3 From 8058139171897eea4a35325b98ba2f72a8c7303f Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Sat, 14 Oct 2017 05:22:37 +0200 Subject: Leaving a room now uses a generated Job file --- CMakeLists.txt | 1 - jobs/generated/leaving.cpp | 30 ++++++++++++++++++++++++++++++ jobs/generated/leaving.h | 31 +++++++++++++++++++++++++++++++ jobs/leaveroomjob.cpp | 26 -------------------------- jobs/leaveroomjob.h | 30 ------------------------------ room.cpp | 6 +++--- room.h | 3 ++- 7 files changed, 66 insertions(+), 61 deletions(-) create mode 100644 jobs/generated/leaving.cpp create mode 100644 jobs/generated/leaving.h delete mode 100644 jobs/leaveroomjob.cpp delete mode 100644 jobs/leaveroomjob.h (limited to 'room.cpp') diff --git a/CMakeLists.txt b/CMakeLists.txt index 35eec50e..ca00ce4f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -78,7 +78,6 @@ set(libqmatrixclient_SRCS jobs/setroomstatejob.cpp jobs/postreceiptjob.cpp jobs/joinroomjob.cpp - jobs/leaveroomjob.cpp jobs/roommessagesjob.cpp jobs/syncjob.cpp jobs/mediathumbnailjob.cpp diff --git a/jobs/generated/leaving.cpp b/jobs/generated/leaving.cpp new file mode 100644 index 00000000..7fed347b --- /dev/null +++ b/jobs/generated/leaving.cpp @@ -0,0 +1,30 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#include "leaving.h" + +#include "jobs/converters.h" +#include + +using namespace QMatrixClient; + +static const auto basePath = QStringLiteral("/_matrix/client/r0"); + +LeaveRoomJob::LeaveRoomJob(QString roomId) + : BaseJob(HttpVerb::Post, "LeaveRoomJob", + basePath % "/rooms/" % roomId % "/leave", + Query { }, + Data { } + ) +{ } + +ForgetRoomJob::ForgetRoomJob(QString roomId) + : BaseJob(HttpVerb::Post, "ForgetRoomJob", + basePath % "/rooms/" % roomId % "/forget", + Query { }, + Data { } + ) +{ } + diff --git a/jobs/generated/leaving.h b/jobs/generated/leaving.h new file mode 100644 index 00000000..96304084 --- /dev/null +++ b/jobs/generated/leaving.h @@ -0,0 +1,31 @@ +/****************************************************************************** + * THIS FILE IS GENERATED - ANY EDITS WILL BE OVERWRITTEN + */ + + +#pragma once + +#include "../basejob.h" + +#include + + +namespace QMatrixClient +{ + + // Operations + + class LeaveRoomJob : public BaseJob + { + public: + explicit LeaveRoomJob(QString roomId); + + }; + class ForgetRoomJob : public BaseJob + { + public: + explicit ForgetRoomJob(QString roomId); + + }; + +} // namespace QMatrixClient diff --git a/jobs/leaveroomjob.cpp b/jobs/leaveroomjob.cpp deleted file mode 100644 index 54e7f307..00000000 --- a/jobs/leaveroomjob.cpp +++ /dev/null @@ -1,26 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2015 Felix Rohrbach - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#include "leaveroomjob.h" - -using namespace QMatrixClient; - -LeaveRoomJob::LeaveRoomJob(const QString& roomId) - : BaseJob(HttpVerb::Post, "LeaveRoomJob", - QStringLiteral("_matrix/client/r0/rooms/%1/leave").arg(roomId)) -{ } diff --git a/jobs/leaveroomjob.h b/jobs/leaveroomjob.h deleted file mode 100644 index 9224c1c8..00000000 --- a/jobs/leaveroomjob.h +++ /dev/null @@ -1,30 +0,0 @@ -/****************************************************************************** - * Copyright (C) 2015 Felix Rohrbach - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - */ - -#pragma once - -#include "basejob.h" - -namespace QMatrixClient -{ - class LeaveRoomJob: public BaseJob - { - public: - explicit LeaveRoomJob(const QString& roomId); - }; -} // namespace QMatrixClient diff --git a/room.cpp b/room.cpp index 53d8fef1..50faae3e 100644 --- a/room.cpp +++ b/room.cpp @@ -21,6 +21,7 @@ #include "jobs/generated/kicking.h" #include "jobs/generated/inviting.h" #include "jobs/generated/banning.h" +#include "jobs/generated/leaving.h" #include "jobs/setroomstatejob.h" #include "events/roomnameevent.h" #include "events/roomaliasesevent.h" @@ -32,7 +33,6 @@ #include "jobs/sendeventjob.h" #include "jobs/roommessagesjob.h" #include "jobs/postreceiptjob.h" -#include "jobs/leaveroomjob.h" #include "connection.h" #include "user.h" @@ -623,9 +623,9 @@ void Room::inviteToRoom(const QString& memberId) connection()->callApi(id(), memberId); } -void Room::leaveRoom() +LeaveRoomJob* Room::leaveRoom() { - connection()->callApi(id()); + return connection()->callApi(id()); } void Room::kickMember(const QString& memberId, const QString& reason) diff --git a/room.h b/room.h index 00d4c333..2d0453bc 100644 --- a/room.h +++ b/room.h @@ -36,6 +36,7 @@ namespace QMatrixClient class Connection; class User; class MemberSorter; + class LeaveRoomJob; class TimelineItem { @@ -158,7 +159,7 @@ namespace QMatrixClient void getPreviousContent(int limit = 10); void inviteToRoom(const QString& memberId); - void leaveRoom(); + LeaveRoomJob* leaveRoom(); void kickMember(const QString& memberId, const QString& reason = {}); void ban(const QString& userId, const QString& reason = {}); void unban(const QString& userId); -- cgit v1.2.3 From 614917ad7c1c0beec847094369a2b3bd383562ca Mon Sep 17 00:00:00 2001 From: Kitsune Ral Date: Tue, 17 Oct 2017 17:12:55 +0900 Subject: Cache the actual user name, not the display name Display name is a calculated thing, name is received from the server. --- room.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'room.cpp') diff --git a/room.cpp b/room.cpp index 50faae3e..65cf2d2a 100644 --- a/room.cpp +++ b/room.cpp @@ -969,7 +969,7 @@ QJsonObject Room::Private::toJson() const { QJsonObject content; content.insert("membership", QStringLiteral("join")); - content.insert("displayname", i->displayname()); + content.insert("displayname", i->name()); content.insert("avatar_url", i->avatarUrl().toString()); QJsonObject memberEvent; -- cgit v1.2.3