Page MenuHomePhorge

No OneTemporary

Size
19 KB
Referenced Files
None
Subscribers
None
diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 455fa52..601bc10 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,107 +1,109 @@
# This file is part of libkazv.
# SPDX-FileCopyrightText: 2022-2023 tusooa <tusooa@kazv.moe>
# SPDX-License-Identifier: AGPL-3.0-or-later
workflow:
rules:
- if: '$CI_PIPELINE_SOURCE == "trigger"'
- if: '$CI_PIPELINE_SOURCE == "merge_request_event"'
when: never
- if: $CI_COMMIT_BRANCH
- if: '$CI_COMMIT_TAG !~ /^phabricator\//'
stages:
- prepare
- lint
- build
- report
.report:
image:
name: 'reg.lily.kazv.moe/infra/phorge-ci-tools:servant'
rules:
- if: $TARGET_PHID
when: always
- when: never
before_script:
- pipelineUrl="$CI_PROJECT_URL"/-/pipelines/"$CI_PIPELINE_ID"
report-start:
extends: .report
stage: prepare
script:
- 'echo "{\"receiver\": \"$TARGET_PHID\", \"type\": \"work\", \"unit\": [{\"name\": \"GitLab CI (information only)\", \"result\": \"skip\", \"details\": \"$pipelineUrl\", \"format\": \"remarkup\"}]}" | /tools/arcanist/bin/arc call-conduit --conduit-uri https://iron.lily-is.land/ --conduit-token "$CONDUIT_TOKEN" -- harbormaster.sendmessage'
-'lint:no-tabs':
+'lint':
stage: lint
- script: |
- echo 'Verify that no source file contains tabs'
- ! egrep -R --exclude-dir=transformed-libs --exclude-dir=Intl.js --exclude-dir=node_modules $'\t' src
+ script:
+ - "echo 'Verify that no source file contains tabs'"
+ - "! egrep -R --exclude-dir=transformed-libs --exclude-dir=Intl.js --exclude-dir=node_modules $'\t' src"
+ - "echo 'Verify that no source file contains trailing spaces'"
+ - "! egrep -R --exclude-dir=transformed-libs --exclude-dir=Intl.js --exclude-dir=node_modules '\\s$' src"
rules: &build-rules
- changes: &src-chg
- Dockerfile.deps
- '**/*.cpp'
- '**/*.hpp'
- '**/CMakeLists.txt'
- '**/*.in'
- '**/*.qml'
- 'src/js/*.js'
- 'src/js/transformed-libs/*.js'
- 'packaging/**'
- 'icons/**'
.build:
stage: build
rules: *build-rules
.build-debug:
extends: .build
script: |
env JOBS=2 ./packaging/GNU-Linux/appimage/build.sh
artifacts:
paths:
- kazv-Debug.AppImage
expire_in: 1 week
.build-prod:
extends: .build
script: |
env JOBS=2 ./packaging/GNU-Linux/appimage/build-prod.sh
artifacts:
paths:
- kazv-Release.AppImage
expire_in: 1 week
'build:GNU/Linux-amd64-debug:kf6':
extends: .build-debug
before_script:
- export KF_VER=6
image:
name: 'reg.lily.kazv.moe/kazv/libkazv/libkazv:servant-ubuntu22.04-debug'
'build:GNU/Linux-amd64-prod:kf6':
extends: .build-prod
before_script:
- export KF_VER=6
image:
name: 'reg.lily.kazv.moe/kazv/libkazv/libkazv:servant-ubuntu22.04-prod'
report-success:
extends: .report
rules:
- if: $TARGET_PHID
when: on_success
- when: never
stage: report
script:
- 'echo "{\"receiver\": \"$TARGET_PHID\", \"type\": \"pass\"}" | /tools/arcanist/bin/arc call-conduit --conduit-uri https://iron.lily-is.land/ --conduit-token "$CONDUIT_TOKEN" -- harbormaster.sendmessage'
report-failure:
extends: .report
rules:
- if: $TARGET_PHID
when: on_failure
- when: never
stage: report
script:
- 'echo "{\"receiver\": \"$TARGET_PHID\", \"type\": \"fail\"}" | /tools/arcanist/bin/arc call-conduit --conduit-uri https://iron.lily-is.land/ --conduit-token "$CONDUIT_TOKEN" -- harbormaster.sendmessage'
diff --git a/src/contents/ui/SendMessageBox.qml b/src/contents/ui/SendMessageBox.qml
index 552ee8e..b8a315a 100644
--- a/src/contents/ui/SendMessageBox.qml
+++ b/src/contents/ui/SendMessageBox.qml
@@ -1,383 +1,383 @@
/*
* This file is part of kazv.
* SPDX-FileCopyrightText: 2020-2023 tusooa <tusooa@kazv.moe>
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
import QtQuick 2.15
import QtQuick.Layouts 1.15
import QtQuick.Controls 2.15
import QtQuick.Window 2.15
import org.kde.kirigami 2.13 as Kirigami
import moe.kazv.mxc.kazv 0.0 as MK
import '.' as Kazv
ColumnLayout {
id: sendMessageBox
property var room
property var draftRelType: ''
property var draftRelatedTo: ''
property var timeline: room.timeline()
property var members: room.members()
function getRelationPrompt(draftRelType) {
if (draftRelType === 'm.in_reply_to') {
return l10n.get('send-message-box-reply-to');
} else if (draftRelType === 'm.replace') {
return l10n.get('send-message-box-edit');
}
}
function getCancelRelationPrompt(draftRelType) {
if (draftRelType === 'm.in_reply_to') {
return l10n.get('send-message-box-remove-reply-to-action');
} else if (draftRelType === 'm.replace') {
return l10n.get('send-message-box-remove-replace-action');
}
}
function replaceDraft(newDraft) {
textArea.changeText(newDraft, /* inhibitTyping = */ true);
}
onRoomChanged: {
textArea.changeText(room.localDraft, true);
}
Popup {
id: completionPopup
objectName: 'completionPopup'
x: 1
y: -height
width: parent.width - 1
contentItem: Kazv.Completion {
id: completion
members: sendMessageBox.members
onMentionUserRequested: (userId) => {
textArea.removePartialMention();
sendMessageBox.mentionUser(userId);
}
}
}
Control {
visible: !!sendMessageBox.draftRelatedTo
Layout.fillWidth: true
-
+
background: Rectangle {
color: Kirigami.Theme.alternateBackgroundColor
}
-
+
contentItem: RowLayout {
spacing: 0
-
+
ColumnLayout {
Layout.fillWidth: true
-
+
Label {
id: replyLabel
Layout.leftMargin: Kirigami.Units.largeSpacing
Layout.topMargin: Kirigami.Units.largeSpacing
Layout.fillWidth: true
text: getRelationPrompt(sendMessageBox.draftRelType)
}
-
+
Item {
id: replyItem
Layout.minimumHeight: Math.min(replyToEventView.implicitHeight, Kirigami.Units.gridUnit * 5)
Layout.maximumHeight: Kirigami.Units.gridUnit * 5
Layout.fillWidth: true
clip: true
Kazv.EventViewWrapper {
id: replyToEventView
anchors {
top: parent.top
left: parent.left
right: parent.right
}
event: room.messageById(sendMessageBox.draftRelatedTo)
compactMode: true
}
}
}
ToolButton {
Layout.alignment: Qt.AlignTop
action: removeRelatedToAction
display: AbstractButton.IconOnly
}
}
}
RowLayout {
TextArea {
id: textArea
objectName: 'draftMessage'
property var shortcutList: ["Ctrl+Return", "Ctrl+Enter"]
property var inhibitTyping: false
placeholderText: l10n.get('send-message-box-input-placeholder')
property string filter: getFilter()
Layout.fillWidth: true
wrapMode: TextEdit.Wrap
persistentSelection: true
onTextChanged: {
room.setLocalDraft(text);
if (!inhibitTyping) {
room.setTyping(true);
}
inhibitTyping = false;
}
function changeText(newText, inhibitTyping) {
textArea.inhibitTyping = inhibitTyping;
textArea.text = newText;
}
onVisibleChanged: {
if (!visible) {
room.updateLocalDraftNow();
}
}
function getFilter() {
const atPos = text.lastIndexOf('@', cursorPosition);
if (atPos < 0) {
return '';
}
const textInBetween = text.slice(atPos, cursorPosition);
const hasSpaces = /\s/.test(textInBetween);
return hasSpaces ? '' : textInBetween;
}
function removePartialMention() {
const atPos = text.lastIndexOf('@', cursorPosition);
text = text.slice(0, atPos) + text.slice(cursorPosition);
cursorPosition = atPos;
}
onFilterChanged: {
sendMessageBox.members.filter = filter.slice(1);
if (filter && sendMessageBox.members.count > 0) {
completionPopup.open();
} else {
completionPopup.close();
}
}
// Shortcut keys for sending messages (TODO: Shortcut keys customized by the user)
Shortcut {
sequences: textArea.shortcutList
onActivated: {
sendAction.trigger()
}
}
DropArea {
anchors.fill: parent
onDropped: (drag) => {
if (drag.hasUrls) {
confirmUploadPopup.call(drag.urls);
}
}
}
function handlePaste() {
if (MK.KazvClipboard.hasUrls) {
confirmUploadPopup.call(MK.KazvClipboard.urls());
} else if (MK.KazvClipboard.hasImage) {
confirmUploadPopup.call([ MK.KazvClipboard.saveClipboardImage() ]);
} else {
textArea.paste();
}
}
Keys.onPressed: (event) => {
if (event.matches(StandardKey.Paste)) {
textArea.handlePaste();
event.accepted = true;
}
}
MouseArea {
anchors.fill: parent
acceptedButtons: Qt.RightButton
preventStealing: true
cursorShape: Qt.IBeamCursor
onClicked: (mouse) => {
if (mouse.button === Qt.RightButton)
textAreaMenu.popup();
}
-
+
Menu {
id: textAreaMenu
MenuItem {
text: l10n.get("action-undo")
icon.name: "edit-undo"
onTriggered: textArea.undo()
enabled: textArea.canUndo
}
MenuItem {
text: l10n.get("action-redo")
icon.name: "edit-redo"
onTriggered: textArea.redo()
enabled: textArea.canRedo
}
MenuSeparator {}
MenuItem {
text: l10n.get("action-cut")
icon.name: "edit-cut"
onTriggered: textArea.cut()
enabled: !!textArea.selectedText
}
MenuItem {
text: l10n.get("action-copy")
icon.name: "edit-copy"
onTriggered: textArea.copy()
enabled: !!textArea.selectedText
}
MenuItem {
text: l10n.get("action-paste")
icon.name: "edit-paste"
onTriggered: textArea.handlePaste()
enabled: textArea.canPaste || MK.KazvClipboard.hasImage || MK.KazvClipboard.hasUrls
}
MenuItem {
text: l10n.get("action-delete")
icon.name: "edit-delete"
onTriggered: textArea.remove(textArea.selectionStart, textArea.selectionEnd)
enabled: !!textArea.selectedText
}
MenuItem {
text: l10n.get("action-select-all")
icon.name: "edit-select-all"
onTriggered: textArea.selectAll()
}
}
}
}
ToolButton {
action: sendMediaFileAction
display: AbstractButton.IconOnly
}
ToolButton {
action: stickersAction
display: AbstractButton.IconOnly
}
ToolButton {
objectName: 'sendButton'
action: sendAction
display: AbstractButton.IconOnly
}
}
function mentionUser(userId) {
const prefix = textArea.text.slice(0, textArea.cursorPosition);
const suffix = textArea.text.slice(textArea.cursorPosition);
let insertion = userId;
// If we are not at the beginning and the prev char is not a space,
// insert a space there.
if (prefix && prefix.slice(prefix.length - 1).trim() !== '') {
insertion = ' ' + insertion;
}
let postPadding = 0;
// If we are at the end or the next char is not a space,
// insert a space there.
if (!suffix || suffix.slice(0, 1).trim() !== '') {
insertion = insertion + ' ';
} else if (suffix) {
// If there is a suffix, and space is not inserted
// this means the next character is a space,
// move the cursor to that space.
postPadding = 1;
}
textArea.text = prefix + insertion + suffix;
textArea.cursorPosition = prefix.length + insertion.length + postPadding;
}
function focusInput() {
textArea.forceActiveFocus();
}
Kirigami.Action {
id: removeRelatedToAction
icon.name: 'window-close-symbolic'
text: getCancelRelationPrompt(sendMessageBox.draftRelType)
onTriggered: {
sendMessageBox.draftRelType = '';
sendMessageBox.draftRelatedTo = '';
}
}
Kirigami.Action {
id: sendAction
icon.name: "document-send"
text: l10n.get("send-message-box-send")
onTriggered: {
room.setTyping(false);
room.sendTextMessage(textArea.text, draftRelType, draftRelatedTo);
textArea.changeText("", true);
sendMessageBox.draftRelType = '';
sendMessageBox.draftRelatedTo = '';
}
enabled: textArea.text !== ''
}
Kirigami.Action {
id: sendMediaFileAction
icon.name: "document-open-data"
text: l10n.get("send-message-box-send-file")
onTriggered: {
fileDialog.open()
}
}
property var confirmUploadPopup: ConfirmUploadPopup {
id: confirmUploadPopup
parent: applicationWindow().overlay
onUploadRequested: (url) => {
sendMessageBox.uploadFile(url);
}
}
property var fileDialog: Kazv.FileDialogAdapter {
onAccepted: {
sendMessageBox.uploadFile(fileUrl);
}
}
function uploadFile(fileUrl) {
kazvIOManager.startNewUploadJob(
matrixSdk.serverUrl, fileUrl, matrixSdk.token,
room.roomId, sdkVars.roomList, room.encrypted
);
}
property var stickerPopup: Kirigami.OverlaySheet {
id: stickerPopup
parent: applicationWindow().overlay
title: l10n.get('send-message-box-stickers-popup-title')
Kazv.StickerPicker {
Layout.preferredWidth: Math.min(Kirigami.Units.gridUnit * 40, Window.width)
stickerPackList: matrixSdk.stickerPackList()
onSendMessageRequested: eventJson => {
console.log(JSON.stringify(eventJson));
room.sendMessage(eventJson, draftRelType, draftRelatedTo);
draftRelType = '';
draftRelatedTo = '';
stickerPopup.close();
}
}
}
Kirigami.Action {
id: stickersAction
icon.name: 'smiley'
text: l10n.get('send-message-box-stickers')
onTriggered: stickerPopup.open()
}
}
diff --git a/src/l10n/hi/100-ui.ftl b/src/l10n/hi/100-ui.ftl
index 65bfae6..9073da8 100644
--- a/src/l10n/hi/100-ui.ftl
+++ b/src/l10n/hi/100-ui.ftl
@@ -1,67 +1,67 @@
### This file is part of kazv.
### SPDX-FileCopyrightText: 2022 xploreinfinity
### SPDX-License-Identifier: AGPL-3.0-or-later
app-title = { -kt-app-name }
global-drawer-title = { -kt-app-name }
global-drawer-action-switch-account = खाता बदले
global-drawer-action-hard-logout = लॉग आउट
-global-drawer-action-save-session = इस सेशन को सेव करें
+global-drawer-action-save-session = इस सेशन को सेव करें
empty-room-page-title = कोई कमरे नहीं चुने गए है
empty-room-page-description = अभी कोई कमरा नहीं चुना गया है।
login-page-title = लॉग इन करें
login-page-userid-prompt = यूज़र आईडी:
login-page-userid-input-placeholder = उदाहरण: @foo:example.org
login-page-password-prompt = पासवर्ड:
login-page-login-button = लॉग इन करें
login-page-close-button = बंद करे
login-page-existing-sessions-prompt = मौजूदा सेशन में से किसी एक को चुनें:
login-page-alternative-password-login-prompt = या यूजर आईडी और पासवर्ड के साथ एक नया सेशन शुरू करें:
login-page-restore-session-button = सेशन पुनर्स्थापित करें
login-page-request-failed-prompt = लॉगिन विफल। एरर कोड: { $errorCode }। एरर संदेश: { $errorMsg }।
login-page-discover-failed-prompt = यह यूज़र जिस सर्वर पर है उसका पता लगाने में असमर्थ, या सर्वर अनुपलब्ध है। एरर कोड: { $errorCode }। एरर संदेश: { $errorMsg }।
## main-page-title = { -kt-app-name } - { $userId }
-main-page-recent-tab-title = रीसेंट
+main-page-recent-tab-title = रीसेंट
main-page-people-tab-title = लोग
main-page-rooms-tab-title = कमरे
## room-list-view-room-item-title = { $name } ({ $roomId })
## room-list-view-room-item-fav-action = Set as favourite
## room-list-view-room-item-fav-action-notification = Set { $name } as favourite
send-message-box-input-placeholder = अपना संदेश यहां लिखें...
## State events
## Common parameters:
## gender = gender of the sender (male/female/neutral)
## stateKeyUser = name of the state key user
## stateKeyUserGender = gender of the state key user
member-state-joined-room = ने कमरे में प्रवेश किया
member-state-changed-name-and-avatar = ने अपना नाम और अवतार बदल दिया है।
member-state-changed-name = ने अपना नाम बदल दिया है।
member-state-changed-avatar = ने अपना अवतार बदल दिया है।
member-state-invited = ने { $stateKeyUser } को इस कमरे में आमंत्रित किया।
member-state-left = कमरे से चला गया।
member-state-kicked = ने { $stateKeyUser } को इस कमरे से बाहर निकाल दिया है ।
member-state-banned = ने { $stateKeyUser } पर प्रतिबंध लगा दिया है।
member-state-unbanned = ने { $stateKeyUser } पर से प्रतिबंध हटा दिया है।
state-room-created = ने यह कमरा बनाया।
state-room-name-changed = ने इस कमरे का नाम बदलकर { $newName } कर दिया है ।
state-room-topic-changed = द्वारा इस कमरे का विषय बदल कर { $newTopic } कर दिया है।
state-room-avatar-changed = द्वारा इस कमरे का अवतार बदल गया है।
state-room-pinned-events-changed = द्वारा इस कमरे के पिन किए गए ईवेंट बदल गए हैं।
state-room-alias-changed = द्वारा इस कमरे के उपनाम बदल गए हैं।
state-room-join-rules-changed = द्वारा इस कमरे में शामिल होने के नियम बदल गए हैं।
state-room-power-levels-changed = ने इस कमरे का पावर लेवल बदल दिया है।
state-room-encryption-activated = ने इस कमरे के लिए एन्क्रिप्शन शुरू किया।
event-message-image-sent = ने भेजी तस्वीर "{ $body }"।
event-message-file-sent = ने भेजी फाइल "{ $body }"।
event-message-video-sent = ने भेजा वीडियो "{ $body }"।
event-message-audio-sent = ने भेजा ऑडियो "{ $body }"।
event-message-audio-play-audio = ऑडियो चलाएं

File Metadata

Mime Type
text/x-diff
Expires
Sun, Oct 11, 1:21 PM (1 d, 14 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1785812
Default Alt Text
(19 KB)

Event Timeline