[IMP] im_livechat, mail: replace _.str.sprintf to web sprintf
Before this commit: _.str.sprintf was being used After this commit: replaced _.str.sprintf with sprintf Task-2810721 closes odoo/odoo#89217 Signed-off-by: Alexandre Kühn (aku) <aku@odoo.com>
This commit is contained in:
committed by
Hiral Bhavsar
parent
f6f4ed7bc9
commit
588cffa967
@@ -6,6 +6,7 @@ var Timer = require('im_livechat.legacy.mail.model.Timer');
|
||||
var Timers = require('im_livechat.legacy.mail.model.Timers');
|
||||
|
||||
var core = require('web.core');
|
||||
const { sprintf } = require('web.utils');
|
||||
|
||||
var _t = core._t;
|
||||
|
||||
@@ -128,13 +129,13 @@ var ThreadTypingMixin = {
|
||||
if (displayableTypingMembers.length === 0) {
|
||||
return '';
|
||||
} else if (displayableTypingMembers.length === 1) {
|
||||
return _.str.sprintf(_t("%s is typing..."), displayableTypingMembers[0].name);
|
||||
return sprintf(_t("%s is typing..."), displayableTypingMembers[0].name);
|
||||
} else if (displayableTypingMembers.length === 2) {
|
||||
return _.str.sprintf(_t("%s and %s are typing..."),
|
||||
return sprintf(_t("%s and %s are typing..."),
|
||||
displayableTypingMembers[0].name,
|
||||
displayableTypingMembers[1].name);
|
||||
} else {
|
||||
return _.str.sprintf(_t("%s, %s and more are typing..."),
|
||||
return sprintf(_t("%s, %s and more are typing..."),
|
||||
displayableTypingMembers[0].name,
|
||||
displayableTypingMembers[1].name);
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@ var Feedback = Widget.extend({
|
||||
this.dp.add(session.rpc('/im_livechat/feedback', args)).then(function (response) {
|
||||
var emoji = RATING_TO_EMOJI[self.rating] || "??";
|
||||
if (!reason) {
|
||||
var content = _.str.sprintf(_t("Rating: %s"), emoji);
|
||||
var content = utils.sprintf(_t("Rating: %s"), emoji);
|
||||
}
|
||||
else {
|
||||
var content = "Rating reason: \n" + reason;
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
/** @odoo-module **/
|
||||
|
||||
import { registerMessagingComponent } from '@mail/utils/messaging_component';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
const { Component } = owl;
|
||||
|
||||
@@ -14,7 +15,7 @@ export class NotificationRequest extends Component {
|
||||
* @returns {string}
|
||||
*/
|
||||
getHeaderText() {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("%s has a request"),
|
||||
this.messaging.partnerRoot.nameOrDisplayName
|
||||
);
|
||||
|
||||
@@ -6,6 +6,7 @@ import config from 'web.config';
|
||||
import core from 'web.core';
|
||||
import field_registry from 'web.field_registry';
|
||||
import session from 'web.session';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
import framework from 'web.framework';
|
||||
import time from 'web.time';
|
||||
|
||||
@@ -91,13 +92,13 @@ var setDelayLabel = function (activities) {
|
||||
if (diff === -1) {
|
||||
toDisplay = _t("Yesterday");
|
||||
} else {
|
||||
toDisplay = _.str.sprintf(_t("%d days overdue"), Math.abs(diff));
|
||||
toDisplay = sprintf(_t("%s days overdue"), Math.round(Math.abs(diff)));
|
||||
}
|
||||
} else { // due
|
||||
if (diff === 1) {
|
||||
toDisplay = _t("Tomorrow");
|
||||
} else {
|
||||
toDisplay = _.str.sprintf(_t("Due in %d days"), Math.abs(diff));
|
||||
toDisplay = sprintf(_t("Due in %s days"), Math.round(Math.abs(diff)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import '@mail/js/activity';
|
||||
import BasicController from 'web.BasicController';
|
||||
import core from 'web.core';
|
||||
import field_registry from 'web.field_registry';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
import ViewDialogs from 'web.view_dialogs';
|
||||
|
||||
var KanbanActivity = field_registry.get('kanban_activity');
|
||||
@@ -62,7 +63,7 @@ var ActivityController = BasicController.extend({
|
||||
res_model: state.model,
|
||||
searchViewId: this.searchViewId,
|
||||
domain: this.model.originalDomain,
|
||||
title: _.str.sprintf(_t("Search: %s"), this.title),
|
||||
title: sprintf(_t("Search: %s"), this.title),
|
||||
no_create: !this.activeActions.create,
|
||||
disable_multiple_selection: true,
|
||||
context: state.context,
|
||||
|
||||
@@ -5,6 +5,7 @@ import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, insertAndReplace, replace } from '@mail/model/model_field_command';
|
||||
|
||||
import { auto_str_to_date, getLangDateFormat, getLangDatetimeFormat } from 'web.time';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'ActivityView',
|
||||
@@ -64,7 +65,7 @@ registerModel({
|
||||
if (!this.activity.assignee) {
|
||||
return clear();
|
||||
}
|
||||
return _.str.sprintf(this.env._t("for %s"), this.activity.assignee.nameOrDisplayName);
|
||||
return sprintf(this.env._t("for %s"), this.activity.assignee.nameOrDisplayName);
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
@@ -83,11 +84,11 @@ registerModel({
|
||||
} else if (diff === -1) {
|
||||
return this.env._t("Yesterday:");
|
||||
} else if (diff < 0) {
|
||||
return _.str.sprintf(this.env._t("%d days overdue:"), Math.abs(diff));
|
||||
return sprintf(this.env._t("%s days overdue:"), Math.round(Math.abs(diff)));
|
||||
} else if (diff === 1) {
|
||||
return this.env._t("Tomorrow:");
|
||||
} else {
|
||||
return _.str.sprintf(this.env._t("Due in %d days:"), Math.abs(diff));
|
||||
return sprintf(this.env._t("Due in %s days:"), Math.round(Math.abs(diff)));
|
||||
}
|
||||
},
|
||||
/**
|
||||
@@ -150,7 +151,7 @@ registerModel({
|
||||
if (!this.activity.summary) {
|
||||
return clear();
|
||||
}
|
||||
return _.str.sprintf(this.env._t("“%s”"), this.activity.summary);
|
||||
return sprintf(this.env._t("“%s”"), this.activity.summary);
|
||||
},
|
||||
},
|
||||
fields: {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, one } from '@mail/model/model_field';
|
||||
import { clear, replace } from '@mail/model/model_field_command';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'AttachmentDeleteConfirmView',
|
||||
@@ -45,7 +46,7 @@ registerModel({
|
||||
* @returns {string}
|
||||
*/
|
||||
_computeBody() {
|
||||
return _.str.sprintf(this.env._t(`Do you really want to delete "%s"?`), this.attachment.displayName);
|
||||
return sprintf(this.env._t(`Do you really want to delete "%s"?`), this.attachment.displayName);
|
||||
},
|
||||
/**
|
||||
* @private
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, replace, unlink } from '@mail/model/model_field_command';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'Composer',
|
||||
@@ -98,9 +99,9 @@ registerModel({
|
||||
}
|
||||
if (this.thread.model === 'mail.channel') {
|
||||
if (this.thread.correspondent) {
|
||||
return _.str.sprintf(this.env._t("Message %s..."), this.thread.correspondent.nameOrDisplayName);
|
||||
return sprintf(this.env._t("Message %s..."), this.thread.correspondent.nameOrDisplayName);
|
||||
}
|
||||
return _.str.sprintf(this.env._t("Message #%s..."), this.thread.displayName);
|
||||
return sprintf(this.env._t("Message #%s..."), this.thread.displayName);
|
||||
}
|
||||
if (this.isLog) {
|
||||
return this.env._t("Log an internal note...");
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, one } from '@mail/model/model_field';
|
||||
import { clear, replace } from '@mail/model/model_field_command';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
/**
|
||||
* Models a suggestion in the composer suggestion.
|
||||
@@ -90,17 +91,17 @@ registerModel({
|
||||
*/
|
||||
_computeTitle() {
|
||||
if (this.cannedResponse) {
|
||||
return _.str.sprintf("%s: %s", this.record.source, this.record.substitution);
|
||||
return sprintf("%s: %s", this.record.source, this.record.substitution);
|
||||
}
|
||||
if (this.thread) {
|
||||
return this.record.name;
|
||||
}
|
||||
if (this.channelCommand) {
|
||||
return _.str.sprintf("%s: %s", this.record.name, this.record.help);
|
||||
return sprintf("%s: %s", this.record.name, this.record.help);
|
||||
}
|
||||
if (this.partner) {
|
||||
if (this.record.email) {
|
||||
return _.str.sprintf("%s (%s)", this.record.nameOrDisplayName, this.record.email);
|
||||
return sprintf("%s (%s)", this.record.nameOrDisplayName, this.record.email);
|
||||
}
|
||||
return this.record.nameOrDisplayName;
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import { OnChange } from '@mail/model/model_onchange';
|
||||
import { addLink, escapeAndCompactTextContent, parseAndTransform } from '@mail/js/utils';
|
||||
import { isEventHandled, markEventHandled } from '@mail/utils/utils';
|
||||
|
||||
import { escape } from '@web/core/utils/strings';
|
||||
import { escape, sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'ComposerView',
|
||||
@@ -635,7 +635,7 @@ registerModel({
|
||||
this.delete();
|
||||
}
|
||||
this.env.services['notification'].notify({
|
||||
message: _.str.sprintf(this.env._t(`Message posted on "%s"`), message.originThread.displayName),
|
||||
message: sprintf(this.env._t(`Message posted on "%s"`), message.originThread.displayName),
|
||||
type: 'info',
|
||||
});
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, insertAndReplace, link, replace, unlink } from '@mail/model/model_field_command';
|
||||
import { escape } from '@web/core/utils/strings';
|
||||
import { escape, sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'Discuss',
|
||||
@@ -79,14 +79,14 @@ registerModel({
|
||||
// XDU FIXME could use a component but be careful with owl's
|
||||
// renderToString https://github.com/odoo/owl/issues/708
|
||||
items.push({
|
||||
label: _.str.sprintf(
|
||||
label: sprintf(
|
||||
`<strong>${this.env._t('Create %s')}</strong>`,
|
||||
`<em><span class="fa fa-hashtag"/>${escapedValue}</em>`,
|
||||
),
|
||||
escapedValue,
|
||||
special: 'public'
|
||||
}, {
|
||||
label: _.str.sprintf(
|
||||
label: sprintf(
|
||||
`<strong>${this.env._t('Create %s')}</strong>`,
|
||||
`<em><span class="fa fa-lock"/>${escapedValue}</em>`,
|
||||
),
|
||||
|
||||
@@ -7,6 +7,7 @@ import emojis from '@mail/js/emojis';
|
||||
import { addLink, htmlToTextContentInline, parseAndTransform, timeFromNow } from '@mail/js/utils';
|
||||
|
||||
import { session } from '@web/session';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
import { format } from 'web.field_utils';
|
||||
import { getLangDatetimeFormat, str_to_datetime } from 'web.time';
|
||||
@@ -610,7 +611,7 @@ registerModel({
|
||||
_computeTrackingValues() {
|
||||
return this.tracking_value_ids.map(trackingValue => {
|
||||
const value = Object.assign({}, trackingValue);
|
||||
value.changed_field = _.str.sprintf(this.env._t("%s:"), value.changed_field);
|
||||
value.changed_field = sprintf(this.env._t("%s:"), value.changed_field);
|
||||
/**
|
||||
* Maps tracked field type to a JS formatter. Tracking values are
|
||||
* not always stored in the same field type as their origin type.
|
||||
|
||||
@@ -4,6 +4,7 @@ import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { insertAndReplace } from '@mail/model/model_field_command';
|
||||
import { markEventHandled } from '@mail/utils/utils';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'MessageReactionGroup',
|
||||
@@ -60,15 +61,15 @@ registerModel({
|
||||
];
|
||||
switch (length) {
|
||||
case 1:
|
||||
return _.str.sprintf(this.env._t('%s has reacted with %s'), firstUser, this.content);
|
||||
return sprintf(this.env._t('%s has reacted with %s'), firstUser, this.content);
|
||||
case 2:
|
||||
return _.str.sprintf(this.env._t('%s and %s have reacted with %s'), firstUser, secondUser, this.content);
|
||||
return sprintf(this.env._t('%s and %s have reacted with %s'), firstUser, secondUser, this.content);
|
||||
case 3:
|
||||
return _.str.sprintf(this.env._t('%s, %s, %s have reacted with %s'), firstUser, secondUser, thirdUser, this.content);
|
||||
return sprintf(this.env._t('%s, %s, %s have reacted with %s'), firstUser, secondUser, thirdUser, this.content);
|
||||
case 4:
|
||||
return _.str.sprintf(this.env._t('%s, %s, %s and 1 other person have reacted with %s'), firstUser, secondUser, thirdUser, this.content);
|
||||
return sprintf(this.env._t('%s, %s, %s and 1 other person have reacted with %s'), firstUser, secondUser, thirdUser, this.content);
|
||||
default:
|
||||
return _.str.sprintf(this.env._t('%s, %s, %s and %s other persons have reacted with %s'), firstUser, secondUser, thirdUser, length - 3, this.content);
|
||||
return sprintf(this.env._t('%s, %s, %s and %s other persons have reacted with %s'), firstUser, secondUser, thirdUser, length - 3, this.content);
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, replace, unlinkAll } from '@mail/model/model_field_command';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
registerModel({
|
||||
name: 'MessageSeenIndicator',
|
||||
@@ -181,19 +182,19 @@ registerModel({
|
||||
return partner.nameOrDisplayName;
|
||||
});
|
||||
if (partnersThatHaveSeen.length === 1) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Seen by %s"),
|
||||
partnersThatHaveSeen[0]
|
||||
);
|
||||
}
|
||||
if (partnersThatHaveSeen.length === 2) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Seen by %s and %s"),
|
||||
partnersThatHaveSeen[0],
|
||||
partnersThatHaveSeen[1]
|
||||
);
|
||||
}
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Seen by %s, %s and more"),
|
||||
partnersThatHaveSeen[0],
|
||||
partnersThatHaveSeen[1]
|
||||
@@ -210,19 +211,19 @@ registerModel({
|
||||
return partner.nameOrDisplayName;
|
||||
});
|
||||
if (partnersThatHaveFetched.length === 1) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Received by %s"),
|
||||
partnersThatHaveFetched[0]
|
||||
);
|
||||
}
|
||||
if (partnersThatHaveFetched.length === 2) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Received by %s and %s"),
|
||||
partnersThatHaveFetched[0],
|
||||
partnersThatHaveFetched[1]
|
||||
);
|
||||
}
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("Received by %s, %s and more"),
|
||||
partnersThatHaveFetched[0],
|
||||
partnersThatHaveFetched[1]
|
||||
|
||||
@@ -4,7 +4,7 @@ import { registerModel } from '@mail/model/model_core';
|
||||
import { decrement, increment, insert, insertAndReplace, link, replace, unlink } from '@mail/model/model_field_command';
|
||||
import { htmlToTextContentInline } from '@mail/js/utils';
|
||||
|
||||
import { escape } from '@web/core/utils/strings';
|
||||
import { escape, sprintf } from '@web/core/utils/strings';
|
||||
import { str_to_datetime } from 'web.time';
|
||||
import { Markup } from 'web.utils';
|
||||
import { renderToString } from "@web/core/utils/render";
|
||||
@@ -190,7 +190,7 @@ registerModel({
|
||||
if (this.messaging.currentUser && invitedByUserId !== this.messaging.currentUser.id) {
|
||||
// Current user was invited by someone else.
|
||||
this.env.services['notification'].notify({
|
||||
message: _.str.sprintf(
|
||||
message: sprintf(
|
||||
this.env._t("You have been invited to #%s"),
|
||||
channel.displayName
|
||||
),
|
||||
@@ -612,7 +612,7 @@ registerModel({
|
||||
if (!channel) {
|
||||
return;
|
||||
}
|
||||
const message = _.str.sprintf(this.env._t("You unsubscribed from %s."), channel.displayName);
|
||||
const message = sprintf(this.env._t("You unsubscribed from %s."), channel.displayName);
|
||||
this.env.services['notification'].notify({ message, type: 'info' });
|
||||
// We assume that arriving here the server has effectively
|
||||
// unpinned the channel
|
||||
@@ -634,7 +634,7 @@ registerModel({
|
||||
if (!channel) {
|
||||
return;
|
||||
}
|
||||
const message = _.str.sprintf(this.env._t("You unpinned your conversation with %s."), channel.displayName);
|
||||
const message = sprintf(this.env._t("You unpinned your conversation with %s."), channel.displayName);
|
||||
this.env.services['notification'].notify({ message, type: 'info' });
|
||||
// We assume that arriving here the server has effectively
|
||||
// unpinned the channel
|
||||
@@ -653,7 +653,7 @@ registerModel({
|
||||
// If the current user invited a new user, and the new user is
|
||||
// connecting for the first time while the current user is present
|
||||
// then open a chat for the current user with the new user.
|
||||
const message = _.str.sprintf(this.env._t('%s connected'), username);
|
||||
const message = sprintf(this.env._t('%s connected'), username);
|
||||
const title = this.env._t("This is their first connection. Wish them luck.");
|
||||
this.env.services['bus_service'].sendNotification({ message, title, type: 'info' });
|
||||
const chat = await this.async(() => this.messaging.getChat({ partnerId }));
|
||||
@@ -685,7 +685,7 @@ registerModel({
|
||||
});
|
||||
const channelName = channel.displayName;
|
||||
const channelNameWithIcon = channelIcon + channelName;
|
||||
notificationTitle = _.str.sprintf(
|
||||
notificationTitle = sprintf(
|
||||
this.env._t("%s from %s"),
|
||||
author.nameOrDisplayName,
|
||||
channelNameWithIcon
|
||||
@@ -704,11 +704,11 @@ registerModel({
|
||||
});
|
||||
messaging.update({ outOfFocusUnreadMessageCounter: increment() });
|
||||
const titlePattern = messaging.outOfFocusUnreadMessageCounter === 1
|
||||
? this.env._t("%d Message")
|
||||
: this.env._t("%d Messages");
|
||||
? this.env._t("%s Message")
|
||||
: this.env._t("%s Messages");
|
||||
this.env.bus.trigger('set_title_part', {
|
||||
part: '_chat',
|
||||
title: _.str.sprintf(titlePattern, messaging.outOfFocusUnreadMessageCounter),
|
||||
title: sprintf(titlePattern, messaging.outOfFocusUnreadMessageCounter),
|
||||
});
|
||||
},
|
||||
/**
|
||||
|
||||
@@ -6,6 +6,7 @@ import { registerModel } from '@mail/model/model_core';
|
||||
import { attr, many, one } from '@mail/model/model_field';
|
||||
import { clear, insert, insertAndReplace, replace, unlink } from '@mail/model/model_field_command';
|
||||
import { monitorAudio } from '@mail/utils/media_monitoring';
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
|
||||
/**
|
||||
* The order in which transceivers are added, relevant for RTCPeerConnection.getTransceivers which returns
|
||||
@@ -243,7 +244,7 @@ registerModel({
|
||||
audioTrack = audioStream.getAudioTracks()[0];
|
||||
} catch (_e) {
|
||||
this.env.services.notification.notify({
|
||||
message: _.str.sprintf(
|
||||
message: sprintf(
|
||||
this.env._t(`"%s" requires microphone access`),
|
||||
window.location.host,
|
||||
),
|
||||
@@ -1001,7 +1002,7 @@ registerModel({
|
||||
}
|
||||
} catch (_e) {
|
||||
this.env.services.notification.notify({
|
||||
message: _.str.sprintf(
|
||||
message: sprintf(
|
||||
this.env._t(`"%s" requires "%s" access`),
|
||||
window.location.host,
|
||||
type === 'user-video' ? 'camera' : 'display',
|
||||
|
||||
@@ -9,6 +9,7 @@ import Timer from '@mail/utils/timer';
|
||||
import { cleanSearchTerm } from '@mail/utils/utils';
|
||||
import * as mailUtils from '@mail/js/utils';
|
||||
|
||||
import { sprintf } from '@web/core/utils/strings';
|
||||
import { str_to_datetime } from 'web.time';
|
||||
|
||||
const getSuggestedRecipientInfoNextTemporaryId = (function () {
|
||||
@@ -1636,19 +1637,19 @@ registerModel({
|
||||
return this.constructor.fields.typingStatusText.default;
|
||||
}
|
||||
if (this.orderedOtherTypingMembers.length === 1) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("%s is typing..."),
|
||||
this.getMemberName(this.orderedOtherTypingMembers[0])
|
||||
);
|
||||
}
|
||||
if (this.orderedOtherTypingMembers.length === 2) {
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("%s and %s are typing..."),
|
||||
this.getMemberName(this.orderedOtherTypingMembers[0]),
|
||||
this.getMemberName(this.orderedOtherTypingMembers[1])
|
||||
);
|
||||
}
|
||||
return _.str.sprintf(
|
||||
return sprintf(
|
||||
this.env._t("%s, %s and more are typing..."),
|
||||
this.getMemberName(this.orderedOtherTypingMembers[0]),
|
||||
this.getMemberName(this.orderedOtherTypingMembers[1])
|
||||
|
||||
Reference in New Issue
Block a user