[SDK] Implement more matrix methods
This commit is contained in:
parent
9bc94c8780
commit
4cc5d263ab
|
@ -341,6 +341,22 @@ class Client {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns the user's own displayname and avatar url. In Matrix it is possible that
|
||||||
|
/// one user can have different displaynames and avatar urls in different rooms. So
|
||||||
|
/// this endpoint first checks if the profile is the same in all rooms. If not, the
|
||||||
|
/// profile will be requested from the homserver.
|
||||||
|
Future<Profile> get ownProfile async {
|
||||||
|
if (rooms.isNotEmpty) {
|
||||||
|
Set<Profile> profileSet = {};
|
||||||
|
for (Room room in rooms) {
|
||||||
|
final user = room.getUserByMXIDSync(userID);
|
||||||
|
profileSet.add(Profile.fromJson(user.content));
|
||||||
|
}
|
||||||
|
if (profileSet.length == 1) return profileSet.first;
|
||||||
|
}
|
||||||
|
return getProfileFromUserId(userID);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the combined profile information for this user. This API may be used to
|
/// Get the combined profile information for this user. This API may be used to
|
||||||
/// fetch the user's own profile information or other users; either locally
|
/// fetch the user's own profile information or other users; either locally
|
||||||
/// or on remote homeservers.
|
/// or on remote homeservers.
|
||||||
|
@ -452,6 +468,15 @@ class Client {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Changes the user's displayname.
|
||||||
|
Future<void> setDisplayname(String displayname) async {
|
||||||
|
await this.jsonRequest(
|
||||||
|
type: HTTPType.PUT,
|
||||||
|
action: "/client/r0/profile/$userID/displayname",
|
||||||
|
data: {"displayname": displayname});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/// Uploads a new user avatar for this user.
|
/// Uploads a new user avatar for this user.
|
||||||
Future<void> setAvatar(MatrixFile file) async {
|
Future<void> setAvatar(MatrixFile file) async {
|
||||||
final uploadResp = await this.upload(file);
|
final uploadResp = await this.upload(file);
|
||||||
|
|
|
@ -37,6 +37,11 @@ import './user.dart';
|
||||||
import 'timeline.dart';
|
import 'timeline.dart';
|
||||||
import 'utils/states_map.dart';
|
import 'utils/states_map.dart';
|
||||||
|
|
||||||
|
enum PushRuleState { notify, mentions_only, dont_notify }
|
||||||
|
enum JoinRules { public, knock, invite, private }
|
||||||
|
enum GuestAccess { can_join, forbidden }
|
||||||
|
enum HistoryVisibility { invited, joined, shared, world_readable }
|
||||||
|
|
||||||
/// Represents a Matrix room.
|
/// Represents a Matrix room.
|
||||||
class Room {
|
class Room {
|
||||||
/// The full qualified Matrix ID for the room in the format '!localid:server.abc'.
|
/// The full qualified Matrix ID for the room in the format '!localid:server.abc'.
|
||||||
|
@ -1145,6 +1150,95 @@ class Room {
|
||||||
);
|
);
|
||||||
return response["event_id"];
|
return response["event_id"];
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
enum PushRuleState { notify, mentions_only, dont_notify }
|
/// Returns all aliases for this room.
|
||||||
|
List<String> get aliases {
|
||||||
|
List<String> aliases = [];
|
||||||
|
for (Event aliasEvent in states.states["m.room.aliases"].values) {
|
||||||
|
if (aliasEvent.content["aliases"] is List) {
|
||||||
|
aliases.addAll(aliasEvent.content["aliases"]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aliases;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A room may be public meaning anyone can join the room without any prior action. Alternatively,
|
||||||
|
/// it can be invite meaning that a user who wishes to join the room must first receive an invite
|
||||||
|
/// to the room from someone already inside of the room. Currently, knock and private are reserved
|
||||||
|
/// keywords which are not implemented.
|
||||||
|
JoinRules get joinRules => getState("m.room.join_rules") != null
|
||||||
|
? JoinRules.values.firstWhere(
|
||||||
|
(r) =>
|
||||||
|
r.toString().replaceAll("JoinRules.", "") ==
|
||||||
|
getState("m.room.join_rules").content["join_rule"],
|
||||||
|
orElse: () => null)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
/// Changes the join rules. You should check first if the user is able to change it.
|
||||||
|
Future<void> setJoinRules(JoinRules joinRules) async {
|
||||||
|
await client.jsonRequest(
|
||||||
|
type: HTTPType.PUT,
|
||||||
|
action: "/client/r0/rooms/$id/state/m.room.join_rules/",
|
||||||
|
data: {
|
||||||
|
"join_rule": joinRules.toString().replaceAll("JoinRules.", ""),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether the user has the permission to change the join rules.
|
||||||
|
bool get canChangeJoinRules => canSendEvent("m.room.join_rules");
|
||||||
|
|
||||||
|
/// This event controls whether guest users are allowed to join rooms. If this event
|
||||||
|
/// is absent, servers should act as if it is present and has the guest_access value "forbidden".
|
||||||
|
GuestAccess get guestAccess => getState("m.room.guest_access") != null
|
||||||
|
? GuestAccess.values.firstWhere(
|
||||||
|
(r) =>
|
||||||
|
r.toString().replaceAll("GuestAccess.", "") ==
|
||||||
|
getState("m.room.guest_access").content["guest_access"],
|
||||||
|
orElse: () => GuestAccess.forbidden)
|
||||||
|
: GuestAccess.forbidden;
|
||||||
|
|
||||||
|
/// Changes the guest access. You should check first if the user is able to change it.
|
||||||
|
Future<void> setGuestAccess(GuestAccess guestAccess) async {
|
||||||
|
await client.jsonRequest(
|
||||||
|
type: HTTPType.PUT,
|
||||||
|
action: "/client/r0/rooms/$id/state/m.room.guest_access/",
|
||||||
|
data: {
|
||||||
|
"guest_access": guestAccess.toString().replaceAll("GuestAccess.", ""),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether the user has the permission to change the guest access.
|
||||||
|
bool get canChangeGuestAccess => canSendEvent("m.room.guest_access");
|
||||||
|
|
||||||
|
/// This event controls whether a user can see the events that happened in a room from before they joined.
|
||||||
|
HistoryVisibility get historyVisibility =>
|
||||||
|
getState("m.room.history_visibility") != null
|
||||||
|
? HistoryVisibility.values.firstWhere(
|
||||||
|
(r) =>
|
||||||
|
r.toString().replaceAll("HistoryVisibility.", "") ==
|
||||||
|
getState("m.room.history_visibility")
|
||||||
|
.content["history_visibility"],
|
||||||
|
orElse: () => null)
|
||||||
|
: null;
|
||||||
|
|
||||||
|
/// Changes the history visibility. You should check first if the user is able to change it.
|
||||||
|
Future<void> setHistoryVisibility(HistoryVisibility historyVisibility) async {
|
||||||
|
await client.jsonRequest(
|
||||||
|
type: HTTPType.PUT,
|
||||||
|
action: "/client/r0/rooms/$id/state/m.room.history_visibility/",
|
||||||
|
data: {
|
||||||
|
"history_visibility":
|
||||||
|
historyVisibility.toString().replaceAll("HistoryVisibility.", ""),
|
||||||
|
},
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether the user has the permission to change the history visibility.
|
||||||
|
bool get canChangeHistoryVisibility =>
|
||||||
|
canSendEvent("m.room.history_visibility");
|
||||||
|
}
|
||||||
|
|
|
@ -15,4 +15,8 @@ class Profile {
|
||||||
: avatarUrl = MxContent(json['avatar_url']),
|
: avatarUrl = MxContent(json['avatar_url']),
|
||||||
displayname = json['displayname'],
|
displayname = json['displayname'],
|
||||||
content = json;
|
content = json;
|
||||||
|
|
||||||
|
bool operator ==(dynamic other) =>
|
||||||
|
this.avatarUrl.mxc == other.avatarUrl.mxc &&
|
||||||
|
this.displayname == other.displayname;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@ author: Zender & Kurtz GbR <p.kurtz@famedly.com>
|
||||||
homepage: https://famedly.com
|
homepage: https://famedly.com
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.1.0 <3.0.0"
|
sdk: ">=2.7.0 <3.0.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
http: ^0.12.0+2
|
http: ^0.12.0+2
|
||||||
|
|
Loading…
Reference in a new issue