diff --git a/.drone.yml b/.drone.yml
new file mode 100644
index 0000000..7bff8df
--- /dev/null
+++ b/.drone.yml
@@ -0,0 +1,38 @@
+kind: pipeline
+type: docker
+name: build
+
+steps:
+ - name: install
+ image: node:lts-alpine
+ commands:
+ - apk add git
+ - npm install
+
+ - name: build
+ image: node:lts-alpine
+ commands:
+ - npm run build
+ depends_on:
+ - install
+
+ - name: publish
+ image: alpine
+ depends_on:
+ - build
+ when:
+ branch:
+ - master
+ environment:
+ USERNAME:
+ from_secret: ftp_username
+ PASSWORD:
+ from_secret: ftp_password
+ APIKEY:
+ from_secret: api_key
+ commands:
+ - apk --no-cache add lftp curl
+ - cd dist
+ - 'curl -X DELETE -H "AccessKey: $PASSWORD" https://storage.bunnycdn.com/mercuryapp/'
+ - 'lftp -e "mirror -P 10 -R" -u $USERNAME,$PASSWORD storage.bunnycdn.com'
+ - 'curl -X POST -H "AccessKey: $APIKEY" https://bunnycdn.com/api/pullzone/733874/purgeCache --data ""'
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index 9cb8606..602f3d0 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,7 @@
"reconnecting-websocket": "^4.4.0",
"romulus-js": "git+https://git.jacknet.io/TerribleCodeClub/romulus-js.git",
"uuid": "^8.3.2",
+ "vanilla-picker": "^2.12.1",
"vue": "^3.2.25",
"vue-router": "^4.0.14"
},
@@ -46,6 +47,11 @@
"url": "https://opencollective.com/popperjs"
}
},
+ "node_modules/@sphinxxxx/color-conversion": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz",
+ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="
+ },
"node_modules/@types/color": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz",
@@ -878,6 +884,14 @@
"uuid": "dist/bin/uuid"
}
},
+ "node_modules/vanilla-picker": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz",
+ "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==",
+ "dependencies": {
+ "@sphinxxxx/color-conversion": "^2.2.2"
+ }
+ },
"node_modules/vite": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
@@ -954,6 +968,11 @@
"integrity": "sha512-q/ytXxO5NKvyT37pmisQAItCFqA7FD/vNb8dgaJy3/630Fsc+Mz9/9f2SziBoIZ30TJooXyTwZmhi1zjXmObYg==",
"peer": true
},
+ "@sphinxxxx/color-conversion": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz",
+ "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw=="
+ },
"@types/color": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/@types/color/-/color-3.0.3.tgz",
@@ -1479,6 +1498,14 @@
"resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
"integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="
},
+ "vanilla-picker": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/vanilla-picker/-/vanilla-picker-2.12.1.tgz",
+ "integrity": "sha512-2qrEP9VYylKXbyzXKsbu2dferBTvqnlsr29XjHwFE+/MEp0VNj6oEUESLDtKZ7DWzGdSv1x/+ujqFZF+KsO3cg==",
+ "requires": {
+ "@sphinxxxx/color-conversion": "^2.2.2"
+ }
+ },
"vite": {
"version": "2.8.6",
"resolved": "https://registry.npmjs.org/vite/-/vite-2.8.6.tgz",
diff --git a/package.json b/package.json
index b6ba803..7b101c4 100644
--- a/package.json
+++ b/package.json
@@ -17,6 +17,7 @@
"reconnecting-websocket": "^4.4.0",
"romulus-js": "git+https://git.jacknet.io/TerribleCodeClub/romulus-js.git",
"uuid": "^8.3.2",
+ "vanilla-picker": "^2.12.1",
"vue": "^3.2.25",
"vue-router": "^4.0.14"
},
diff --git a/src/components/settings/ColorPicker.vue b/src/components/settings/ColorPicker.vue
new file mode 100644
index 0000000..c66fe31
--- /dev/null
+++ b/src/components/settings/ColorPicker.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
diff --git a/src/components/userlist/User.vue b/src/components/userlist/User.vue
index a1807eb..2031233 100644
--- a/src/components/userlist/User.vue
+++ b/src/components/userlist/User.vue
@@ -8,5 +8,13 @@ import { computed } from 'vue'
const props = defineProps(['user'])
const user = props.user
-const color = computed(() => { return user.color?.hex() ?? '#6c757d' })
+const bootstrapSecondaryColor = getComputedStyle(document.documentElement).getPropertyValue('--bs-secondary')
+
+const color = computed(() => { return user.color?.hex() ?? bootstrapSecondaryColor })
+
+
\ No newline at end of file
diff --git a/src/plugins/websocket.js b/src/plugins/websocket.js
index f367c23..ecdd0ab 100644
--- a/src/plugins/websocket.js
+++ b/src/plugins/websocket.js
@@ -5,6 +5,7 @@ import { useUserStore } from '../stores/userStore'
import { useMessageStore } from '../stores/messageStore'
import { useChannelStore } from '../stores/channelStore'
import { decrypt } from 'romulus-js'
+import { provide } from 'vue'
const CLIENT_ID = 'Mercury'
const SUBSCRIBED_MESSAGE_TYPES = [MessageTypes.Basic, MessageTypes.UserDataRequest, MessageTypes.UserDataResponse]
@@ -105,6 +106,8 @@ export default {
})
}
+ app.provide('requestUserData', requestUserData)
+
// Keepalive timeout.
var timeout = setInterval(() => {
ws.send(packers[MessageTypes.Keepalive]())
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
index d3e3f2a..2b16900 100644
--- a/src/views/HomeView.vue
+++ b/src/views/HomeView.vue
@@ -5,11 +5,11 @@
Welcome to Mercury!
-

-
+
+
Mercury is a web-based BENNC client.
-
+
Go to Settings to configure your client.
@@ -26,10 +26,10 @@ import Content from '../components/Content.vue'
#logo {
filter: invert(80%);
}
-h1 {
+/* h1 {
--animate-delay: 0.5s;
}
h2 {
--animate-delay: 0.5s;
-}
+} */
\ No newline at end of file
diff --git a/src/views/SettingsView.vue b/src/views/SettingsView.vue
index 8dbd358..d13475f 100644
--- a/src/views/SettingsView.vue
+++ b/src/views/SettingsView.vue
@@ -3,8 +3,16 @@
Settings
+ User
+
Channels
-
+
| Name |
Key |
@@ -38,8 +46,23 @@ import { useChannelStore } from '../stores/channelStore'
import Key from '../components/common/Key.vue'
import Sidebar from '../components/Sidebar.vue'
import Content from '../components/Content.vue'
+import ColorPicker from '../components/settings/ColorPicker.vue';
+import { inject, ref } from 'vue';
+import { useUserStore } from '../stores/userStore';
const channelStore = useChannelStore()
+const userStore = useUserStore()
+const requestUserData = inject('requestUserData')
+
+const self = userStore.getSelf()
+
+const username = ref('')
+username.value = self.name
+
+function saveUsername() {
+ userStore.setName(-1, username.value)
+ requestUserData()
+}