summaryrefslogtreecommitdiffstats
path: root/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js
diff options
context:
space:
mode:
Diffstat (limited to 'comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js')
-rw-r--r--comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js191
1 files changed, 191 insertions, 0 deletions
diff --git a/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js b/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js
new file mode 100644
index 0000000000..5a1088566b
--- /dev/null
+++ b/comm/chat/protocols/matrix/lib/matrix-sdk/extensible_events_v1/PollStartEvent.js
@@ -0,0 +1,191 @@
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.PollStartEvent = exports.PollAnswerSubevent = void 0;
+var _matrixEventsSdk = require("matrix-events-sdk");
+var _MessageEvent = require("./MessageEvent");
+var _extensible_events = require("../@types/extensible_events");
+var _polls = require("../@types/polls");
+var _InvalidEventError = require("./InvalidEventError");
+var _ExtensibleEvent = require("./ExtensibleEvent");
+function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
+function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
+function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
+function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return typeof key === "symbol" ? key : String(key); }
+function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (typeof res !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } /*
+ Copyright 2022 - 2023 The Matrix.org Foundation C.I.C.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+ */
+/**
+ * Represents a poll answer. Note that this is represented as a subtype and is
+ * not registered as a parsable event - it is implied for usage exclusively
+ * within the PollStartEvent parsing.
+ */
+class PollAnswerSubevent extends _MessageEvent.MessageEvent {
+ constructor(wireFormat) {
+ super(wireFormat);
+ /**
+ * The answer ID.
+ */
+ _defineProperty(this, "id", void 0);
+ const id = wireFormat.content.id;
+ if (!id || typeof id !== "string") {
+ throw new _InvalidEventError.InvalidEventError("Answer ID must be a non-empty string");
+ }
+ this.id = id;
+ }
+ serialize() {
+ return {
+ type: "org.matrix.sdk.poll.answer",
+ content: _objectSpread({
+ id: this.id
+ }, this.serializeMMessageOnly())
+ };
+ }
+
+ /**
+ * Creates a new PollAnswerSubevent from ID and text.
+ * @param id - The answer ID (unique within the poll).
+ * @param text - The text.
+ * @returns The representative answer.
+ */
+ static from(id, text) {
+ return new PollAnswerSubevent({
+ type: "org.matrix.sdk.poll.answer",
+ content: {
+ id: id,
+ [_extensible_events.M_TEXT.name]: text
+ }
+ });
+ }
+}
+
+/**
+ * Represents a poll start event.
+ */
+exports.PollAnswerSubevent = PollAnswerSubevent;
+class PollStartEvent extends _ExtensibleEvent.ExtensibleEvent {
+ /**
+ * Creates a new PollStartEvent from a pure format. Note that the event is *not*
+ * parsed here: it will be treated as a literal m.poll.start primary typed event.
+ * @param wireFormat - The event.
+ */
+ constructor(wireFormat) {
+ super(wireFormat);
+ /**
+ * The question being asked, as a MessageEvent node.
+ */
+ _defineProperty(this, "question", void 0);
+ /**
+ * The interpreted kind of poll. Note that this will infer a value that is known to the
+ * SDK rather than verbatim - this means unknown types will be represented as undisclosed
+ * polls.
+ *
+ * To get the raw kind, use rawKind.
+ */
+ _defineProperty(this, "kind", void 0);
+ /**
+ * The true kind as provided by the event sender. Might not be valid.
+ */
+ _defineProperty(this, "rawKind", void 0);
+ /**
+ * The maximum number of selections a user is allowed to make.
+ */
+ _defineProperty(this, "maxSelections", void 0);
+ /**
+ * The possible answers for the poll.
+ */
+ _defineProperty(this, "answers", void 0);
+ const poll = _polls.M_POLL_START.findIn(this.wireContent);
+ if (!poll?.question) {
+ throw new _InvalidEventError.InvalidEventError("A question is required");
+ }
+ this.question = new _MessageEvent.MessageEvent({
+ type: "org.matrix.sdk.poll.question",
+ content: poll.question
+ });
+ this.rawKind = poll.kind;
+ if (_polls.M_POLL_KIND_DISCLOSED.matches(this.rawKind)) {
+ this.kind = _polls.M_POLL_KIND_DISCLOSED;
+ } else {
+ this.kind = _polls.M_POLL_KIND_UNDISCLOSED; // default & assumed value
+ }
+
+ this.maxSelections = Number.isFinite(poll.max_selections) && poll.max_selections > 0 ? poll.max_selections : 1;
+ if (!Array.isArray(poll.answers)) {
+ throw new _InvalidEventError.InvalidEventError("Poll answers must be an array");
+ }
+ const answers = poll.answers.slice(0, 20).map(a => new PollAnswerSubevent({
+ type: "org.matrix.sdk.poll.answer",
+ content: a
+ }));
+ if (answers.length <= 0) {
+ throw new _InvalidEventError.InvalidEventError("No answers available");
+ }
+ this.answers = answers;
+ }
+ isEquivalentTo(primaryEventType) {
+ return (0, _extensible_events.isEventTypeSame)(primaryEventType, _polls.M_POLL_START);
+ }
+ serialize() {
+ return {
+ type: _polls.M_POLL_START.name,
+ content: {
+ [_polls.M_POLL_START.name]: {
+ question: this.question.serialize().content,
+ kind: this.rawKind,
+ max_selections: this.maxSelections,
+ answers: this.answers.map(a => a.serialize().content)
+ },
+ [_extensible_events.M_TEXT.name]: `${this.question.text}\n${this.answers.map((a, i) => `${i + 1}. ${a.text}`).join("\n")}`
+ }
+ };
+ }
+
+ /**
+ * Creates a new PollStartEvent from question, answers, and metadata.
+ * @param question - The question to ask.
+ * @param answers - The answers. Should be unique within each other.
+ * @param kind - The kind of poll.
+ * @param maxSelections - The maximum number of selections. Must be 1 or higher.
+ * @returns The representative poll start event.
+ */
+ static from(question, answers, kind, maxSelections = 1) {
+ return new PollStartEvent({
+ type: _polls.M_POLL_START.name,
+ content: {
+ [_extensible_events.M_TEXT.name]: question,
+ // unused by parsing
+ [_polls.M_POLL_START.name]: {
+ question: {
+ [_extensible_events.M_TEXT.name]: question
+ },
+ kind: kind instanceof _matrixEventsSdk.NamespacedValue ? kind.name : kind,
+ max_selections: maxSelections,
+ answers: answers.map(a => ({
+ id: makeId(),
+ [_extensible_events.M_TEXT.name]: a
+ }))
+ }
+ }
+ });
+ }
+}
+exports.PollStartEvent = PollStartEvent;
+const LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
+function makeId() {
+ return [...Array(16)].map(() => LETTERS.charAt(Math.floor(Math.random() * LETTERS.length))).join("");
+} \ No newline at end of file