A lot of changes :/

This commit is contained in:
supertiger1234 2019-10-01 14:46:30 +01:00
parent 0082f767ae
commit 652f06d18f
18 changed files with 507 additions and 460 deletions

View file

@ -1,412 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 530 565.5" style="enable-background:new 0 0 530 565.5;" xml:space="preserve">
viewBox="0 0 477 477" style="enable-background:new 0 0 477 477;" xml:space="preserve">
<style type="text/css">
.st0{display:none;}
.st1{display:inline;}
.st2{fill:#3FA9F5;}
.st3{display:none;fill:#3FA9F5;}
.st4{display:inline;fill:none;}
.st5{stroke:#FFFFFF;stroke-miterlimit:10;}
.st6{fill:none;stroke:#FFFFFF;stroke-width:4;stroke-miterlimit:10;}
.st7{fill:#FFFFFF;stroke:#FFFFFF;stroke-width:4;stroke-miterlimit:10;}
.st8{fill:#3FA9F5;stroke:#FFFFFF;stroke-width:4;stroke-miterlimit:10;}
.st9{fill:#FFFFFF;stroke:#3FA9F5;stroke-width:4;stroke-miterlimit:10;}
.st0{fill:#3FA9F5;}
.st1{fill:#FFFFFF;}
.st2{fill:none;stroke:#3FA9F5;stroke-width:4;stroke-miterlimit:10;}
</style>
<g id="Layer_4" class="st0">
<g class="st1">
<rect x="7.5" y="28" width="522" height="502.5"/>
<path d="M529,28.5V530H8V28.5H529 M530,27.5H7V531h523V27.5L530,27.5z"/>
<g id="Background">
<path id="Disc" class="st0" d="M477,238.5c0,84.1-43.5,158-109.2,200.5c-37.2,24.1-81.6,38-129.3,38C106.8,477,0,370.2,0,238.5
S106.8,0,238.5,0S477,106.8,477,238.5z"/>
</g>
<g id="Cat">
<path id="Head" class="st1" d="M401.1,122.2c-1.2-1.5-2.9-2.2-4.7-2.2h0c-8.1,0.2-26.6,16.9-56.2,44.1
c-29.3,27-62.6,57.7-76.2,58.3c-6.6,0.3-25.3,0.4-25.5,0.4c-0.2,0-18.9-0.1-25.5-0.4c-13.6-0.7-46.8-31.3-76.2-58.3
c-29.5-27.2-48-43.9-56.2-44.1c-1.9,0-3.5,0.7-4.7,2.2c-6.3,7.4-2,33.8,3.4,62.5c0.9,4.8,1.7,9,2.2,12c3.3,20.8,23,119,33.2,142.7
c12,27.6,28.2,37.8,42.6,46.8l1.7,1.1c25.7,16.2,74.6,19.1,76.7,19.2l5.8,0l0.1,0c2.1-0.1,50.9-3,76.7-19.2l1.7-1.1
c14.3-9,30.6-19.3,42.6-46.8c10.2-23.6,29.9-121.8,33.2-142.7c0.5-3,1.3-7.2,2.2-12C403.1,155.9,407.4,129.6,401.1,122.2z"/>
<g id="Mouth">
<path class="st0" d="M222.1,353.5c-8.3,0-14.7-4.7-16.8-12.4c-0.2-0.6,0-1,0.2-1.3c0.3-0.4,0.8-0.6,1.3-0.6c0.7,0,1.2,0.4,1.4,1.1
c1.6,6.3,6.9,10.2,13.8,10.2c1.6,0,3.2-0.2,4.8-0.6c5.7-1.5,9.8-6.3,10.1-11.6c0-1,0.9-1.5,1.6-1.5c0.4,0,0.8,0.2,1.1,0.4
c0.3,0.3,0.4,0.6,0.4,1c-0.3,7.1-5.8,13.2-13.4,14.8C225.1,353.3,223.6,353.5,222.1,353.5z"/>
<path class="st2" d="M238.5,338.2c0,0,11.1-7.9,9.5-11.2c-1-1.9-7.1-1.9-9.5-1.9s-8.5,0-9.5,1.9
C227.4,330.3,238.5,338.2,238.5,338.2z"/>
<path class="st0" d="M250.4,353c-7.6-1.6-13.1-7.7-13.4-14.8c0-0.4,0.1-0.7,0.4-1c0.3-0.2,0.7-0.4,1.1-0.4c0.7,0,1.6,0.5,1.6,1.5
c0.3,5.3,4.4,10.1,10.1,11.6c1.6,0.4,3.2,0.6,4.8,0.6c6.9,0,12.2-3.9,13.8-10.2c0.2-0.7,0.7-1.1,1.4-1.1c0.5,0,1,0.2,1.3,0.6
c0.2,0.3,0.4,0.7,0.2,1.3c-2.1,7.7-8.5,12.4-16.8,12.4C253.4,353.5,251.9,353.3,250.4,353z"/>
</g>
</g>
<g id="Circle">
<path class="st2" d="M502,277.5c0,84.1-43.5,158-109.2,200.5c-37.2,24.1-81.6,38-129.3,38C131.8,516,25,409.2,25,277.5
S131.8,39,263.5,39S502,145.8,502,277.5z"/>
<path class="st3" d="M450.3,425.8l-52.4,48.7c0,0,108.6,20,115.6,0c0,0-20.6-4.8-29-10C471.2,456.2,450.3,425.8,450.3,425.8z"/>
</g>
<g id="Other" class="st0">
<image style="display:inline;overflow:visible;opacity:0.1;" width="556" height="553" xlink:href="data:image/jpeg;base64,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
eYfXmlQfJXqL0CvUXoFaFA8grR/+Sn//2Q==" transform="matrix(0.7501 0 0 0.7501 33.5 68.5)">
</image>
<path class="st4" d="M224.5,353.5"/>
</g>
<g id="Symretra">
<g id="Symretra_1_">
<g>
<path class="st5" d="M278.6,137.1"/>
<path class="st5" d="M278.6,137.1"/>
<path class="st6" d="M323.1,271.4"/>
<path class="st6" d="M323.1,271.4"/>
<path class="st7" d="M263.5,443.6v-0.2h2.8c0.1,0,12.7-0.7,28.2-3.4c14.3-2.5,34.2-7.2,47.4-15.5c0.5-0.3,1.1-0.7,1.6-1
c14.1-8.9,30.1-18.9,41.9-45.9c10.3-23.6,29.8-121.4,33.1-142.2c0.5-3,1.2-7,2.1-11.7c3.8-20.2,10.1-53.9,3.9-61.1
c-0.8-1-1.9-1.4-3.1-1.4c-7.7,0.2-30.6,21.2-54.7,43.5c-29.6,27.3-63.2,58.2-77.6,58.9c-6.6,0.3-25.4,0.4-25.6,0.4l0-0.2
c0.2,0,19-0.1,25.6-0.4c14.3-0.7,47.8-31.6,77.5-58.9c25.3-23.3,47.1-43.4,54.9-43.5c0,0,0.1,0,0.1,0c1.2,0,2.3,0.5,3.1,1.5
c6.2,7.3,0.2,39.8-3.9,61.3c-0.9,4.7-1.6,8.7-2.1,11.7c-3.3,20.7-22.8,118.6-33.1,142.2c-11.8,27.1-27.8,37.1-41.9,46
c-0.5,0.3-1.1,0.7-1.6,1c-13.2,8.3-33.1,13-47.4,15.5c-15.5,2.7-28.1,3.4-28.3,3.4H263.5z"/>
<path class="st7" d="M263.5,443.5h2.8c0,0,50.1-2.8,75.7-18.9c14.4-9.1,31.3-18.9,43.5-47c10.4-24,30.1-123.3,33.1-142.2
c2.8-18,16.1-74.7,2.8-74.4c-17.2,0.4-106.2,101.1-132.3,102.4c-6.7,0.3-25.6,0.4-25.6,0.4"/>
<path class="st8" d="M380.5,296c-10.9,0-39.4-17.1-42-22.6c-0.8-1.7,0.7-5.7,4.5-11.8c12.7-20.1,48-58,58.2-58
c0.5,0,1,0.1,1.4,0.3c1.4,0.7,2.2,3.1,2.3,7.2c0.8,20.6-15.7,80.6-21.6,84.2C382.7,295.8,381.7,296,380.5,296z"/>
<path class="st8" d="M402.6,204.1c9.4,4.8-12.6,87.1-19.2,91.2c-7.3,4.4-41.9-16-44.8-21.9C334.4,264.7,392.4,198.9,402.6,204.1z
"/>
<path class="st8" d="M331.6,360.4c-10,0-18.1-11.7-18.1-26.1s8.1-26.1,18.1-26.1s18.1,11.7,18.1,26.1S341.6,360.4,331.6,360.4z"
/>
<ellipse class="st8" cx="331.6" cy="334.3" rx="18" ry="26"/>
<g>
<path class="st2" d="M279.9,392.5c-1.5,0-3-0.2-4.5-0.5c-7.6-1.6-13.1-7.7-13.4-14.8c0-0.4,0.1-0.8,0.4-1
c0.3-0.3,0.7-0.4,1.1-0.4c0.7,0,1.5,0.5,1.6,1.5c0.2,5.3,4.4,10.1,10.1,11.6c1.6,0.4,3.2,0.6,4.8,0.6c6.9,0,12.2-3.9,13.8-10.2
c0.2-0.7,0.7-1.1,1.4-1.1c0.5,0,1,0.2,1.3,0.6c0.2,0.2,0.4,0.7,0.2,1.3C294.6,387.7,288.2,392.5,279.9,392.5L279.9,392.5z"/>
<path class="st2" d="M296.6,380c-2.5,9.6-11.8,13.8-21.1,11.8c-7-1.5-13-7.3-13.3-14.7c-0.1-1.8,2.8-1.8,2.8,0
c0.3,5.7,4.8,10.3,10.1,11.7c8.1,2.1,16.5-1.1,18.8-9.6C294.3,377.5,297,378.3,296.6,380L296.6,380z"/>
</g>
<path class="st9" d="M263.6,377.3l-0.1-0.2c0.1-0.1,11-7.9,9.4-11.1c-0.9-1.8-9.3-1.8-9.4-1.8V364c0.4,0,8.6,0,9.5,1.9
C274.7,369.2,264,376.9,263.6,377.3z"/>
<path class="st9" d="M263.5,364.1c0,0,8.5,0,9.5,1.9c1.6,3.3-9.5,11.2-9.5,11.2"/>
<path class="st6" d="M263.5,364.1"/>
<path class="st6" d="M263.5,364.1"/>
<path class="st6" d="M265.4,364.1"/>
<path class="st6" d="M265.4,364.1"/>
</g>
<g>
<path class="st5" d="M248.4,137.1"/>
<path class="st5" d="M248.4,137.1"/>
<path class="st6" d="M203.9,271.4"/>
<path class="st6" d="M203.9,271.4"/>
<path class="st7" d="M263.5,443.6h-2.8c-0.1,0-12.7-0.7-28.3-3.4c-14.4-2.5-34.2-7.2-47.4-15.5c-0.5-0.3-1.1-0.7-1.6-1
c-14.2-8.9-30.2-18.9-41.9-46c-10.3-23.6-29.8-121.5-33.1-142.2c-0.5-3-1.2-7-2.1-11.7c-4-21.5-10.1-54-3.9-61.3
c0.8-1,1.9-1.5,3.1-1.5c0,0,0.1,0,0.1,0c7.8,0.2,29.6,20.3,54.9,43.5c29.6,27.3,63.2,58.2,77.5,58.9c6.6,0.3,25.4,0.4,25.6,0.4
l0,0.2c-0.2,0-19-0.1-25.6-0.4c-14.4-0.7-47.9-31.7-77.6-58.9c-24.2-22.3-47-43.3-54.7-43.5c-1.2,0-2.3,0.4-3.1,1.4
c-6.2,7.3,0.1,41,3.9,61.1c0.9,4.7,1.6,8.7,2.1,11.7c3.3,20.7,22.8,118.5,33.1,142.2c11.7,27,27.7,37.1,41.9,45.9
c0.5,0.3,1.1,0.7,1.6,1c13.2,8.3,33,13,47.4,15.5c15.5,2.7,28.1,3.4,28.2,3.4h2.8V443.6z"/>
<path class="st7" d="M263.5,443.5h-2.8c0,0-50.1-2.8-75.7-18.9c-14.4-9.1-31.3-18.9-43.5-47c-10.4-24-30.1-123.3-33.1-142.2
c-2.8-18-16.1-74.7-2.8-74.4c17.2,0.4,106.2,101.1,132.3,102.4c6.7,0.3,25.6,0.4,25.6,0.4"/>
<path class="st8" d="M146.5,296c-1.2,0-2.2-0.2-2.9-0.6c-5.9-3.6-22.3-63.6-21.6-84.2c0.1-4,0.9-6.5,2.3-7.2
c0.4-0.2,0.9-0.3,1.4-0.3c10.2,0,45.5,37.8,58.2,58c3.8,6.1,5.3,10,4.5,11.8C185.9,278.9,157.4,296,146.5,296
C146.5,296,146.5,296,146.5,296z"/>
<path class="st8" d="M124.4,204.1c-9.4,4.8,12.6,87.1,19.2,91.2c7.3,4.4,41.9-16,44.8-21.9C192.6,264.7,134.6,198.9,124.4,204.1z
"/>
<ellipse class="st8" cx="195.4" cy="334.3" rx="18.1" ry="26.1"/>
<ellipse class="st8" cx="195.4" cy="334.3" rx="18" ry="26"/>
<g>
<path class="st2" d="M247.1,392.5c-8.3,0-14.7-4.7-16.8-12.4c-0.2-0.6,0-1,0.2-1.3c0.3-0.4,0.8-0.6,1.3-0.6
c0.7,0,1.2,0.4,1.4,1.1c1.6,6.3,6.9,10.2,13.8,10.2c1.6,0,3.2-0.2,4.8-0.6c5.7-1.5,9.8-6.3,10.1-11.6c0-1,0.9-1.5,1.6-1.5
c0.4,0,0.8,0.2,1.1,0.4c0.3,0.3,0.4,0.6,0.4,1c-0.3,7.1-5.8,13.2-13.4,14.8C250.1,392.3,248.6,392.5,247.1,392.5z"/>
<path class="st2" d="M230.4,380c2.5,9.6,11.8,13.8,21.1,11.8c7-1.5,13-7.3,13.3-14.7c0.1-1.8-2.8-1.8-2.8,0
c-0.3,5.7-4.8,10.3-10.1,11.7c-8.1,2.1-16.5-1.1-18.8-9.6C232.7,377.5,230,378.3,230.4,380L230.4,380z"/>
</g>
<path class="st9" d="M263.4,377.3c-0.5-0.3-11.2-8-9.5-11.4c1-1.9,9.2-1.9,9.5-1.9v0.2c-0.1,0-8.5,0-9.4,1.8
c-1.6,3.2,9.3,11,9.4,11.1L263.4,377.3z"/>
<path class="st9" d="M263.5,364.1c0,0-8.5,0-9.5,1.9c-1.6,3.3,9.5,11.2,9.5,11.2"/>
<path class="st6" d="M263.5,364.1"/>
<path class="st6" d="M263.5,364.1"/>
<path class="st6" d="M261.6,364.1"/>
<path class="st6" d="M261.6,364.1"/>
</g>
<g id="Ears">
<path class="st0" d="M100.7,166.7c-0.3,0-0.4,0.1-0.5,0.1c0,0-1.1,0.8-1.2,5.5c-0.7,20.6,15.8,79.1,20.7,82.4
c0.1,0.1,0.7,0.3,1.9,0.3c10.5,0,38.1-17,40.1-21.3c0,0,0.7-1.8-4.4-9.9C144.2,203.1,109.4,166.7,100.7,166.7z"/>
<path class="st0" d="M376.3,166.7c0.3,0,0.4,0.1,0.5,0.1c0,0,1.1,0.8,1.2,5.5c0.7,20.6-15.8,79.1-20.7,82.4
c-0.1,0.1-0.7,0.3-1.9,0.3c-10.5,0-38.1-17-40.1-21.3c0,0-0.7-1.8,4.4-9.9C332.8,203.1,367.6,166.7,376.3,166.7z"/>
</g>
<g id="Eyes">
<ellipse class="st0" cx="170.4" cy="295.3" rx="16.1" ry="24.1"/>
<ellipse class="st0" cx="306.6" cy="295.3" rx="16.1" ry="24.1"/>
</g>
</g>
<g id="Guideline" class="st0">
<line class="st1" x1="263.5" y1="0" x2="263.5" y2="555"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -3,11 +3,12 @@
class="member"
@click="openUserInformation()"
@mouseover="hover = true" @mouseleave="hover = false"
@contextmenu.prevent="rightClickEvent"
>
<Profile-picture
class="avatar"
:url="`${userAvatar}${hover ? '' : '?type=png'}`"
size="35px"
size="30px"
:unique-i-d="user.uniqueID"
:status="presense"
/>
@ -47,7 +48,7 @@ export default {
return this.$store.getters.user.status || 0
}
const presences = this.$store.getters['members/presences'];
const userPresense = presences[this.user.uniqueID]
const userPresense = presences[this.user.uniqueID];
return userPresense || 0
}
},
@ -55,6 +56,11 @@ export default {
openUserInformation() {
this.$store.dispatch('setUserInformationPopout', this.user.uniqueID)
},
rightClickEvent(event) {
const x = event.clientX;
const y = event.clientY;
this.$store.dispatch('setServerMemberContext', {serverID: this.$store.getters['servers/selectedServerID'], uniqueID: this.user.uniqueID, x, y});
}
}
}
@ -65,12 +71,10 @@ export default {
.member {
display: flex;
padding: 3px;
margin: 10px;
margin-top: 3px;
margin-bottom: 3px;
margin: 3px 5px;
align-items: center;
align-content: center;
border-radius: 10px;
border-radius: 5px;
transition: 0.3s;
cursor: pointer;
user-select: none;

View file

@ -6,9 +6,19 @@
</div>
</div>
<div class="members">
<div class="tab" v-if="onlineMembers.length">Online ({{onlineMembers.length}})</div>
<member-template
v-for="member in onlineMembers"
:key="member.member.uniqueID"
:type="member.type"
:avatar="member.member.avatar"
:user="member.member"
/>
<div class="tab" v-if="offlineMembers.length">Offline ({{offlineMembers.length}})</div>
<member-template
v-for="(member, index) in members"
:key="index"
v-for="member in offlineMembers"
:key="member.member.uniqueID"
:type="member.type"
:avatar="member.member.avatar"
:user="member.member"
@ -26,11 +36,19 @@ export default {
const members = this.$store.getters['members/members'];
const serverMembers = this.$store.getters['servers/serverMembers']
const selectedServerID = this.$store.getters['servers/selectedServerID'];
const presences = this.$store.getters['members/presences'];
let filteredSM = serverMembers.filter(sm => sm.server_id === selectedServerID);
let getMember = filteredSM.map(sm => {
sm.member = members[sm.uniqueID];
// attach presense
if (sm.uniqueID === this.$store.getters.user.uniqueID) {
sm.presense = this.$store.getters.user.status || 0
} else {
sm.presense = presences[sm.uniqueID] || 0
}
return sm;
})
const sort = getMember.sort((a, b) => {
@ -46,6 +64,12 @@ export default {
})
return sort;
},
onlineMembers() {
return this.members.filter(sm => sm.presense >= 1)
},
offlineMembers() {
return this.members.filter(sm => sm.presense == 0)
}
}
}
@ -78,5 +102,15 @@ export default {
padding-top: 10px;
overflow: auto;
}
.tab {
background: rgba(0, 0, 0, 0.308);
padding: 5px;
border-radius: 5px;
margin: 5px;
user-select: none;
cursor: default;
color: rgb(200, 200, 200);
font-size: 15px;
}
</style>

View file

@ -66,8 +66,9 @@
</div>
<div
v-if="type && (type === 1 || type === 2)"
:class="{'presence-message': true, green: type === 1, red: type === 2}"
v-if="type && (type === 1 || type === 2 || type === 3 || type === 4)"
class="presence-message"
:class="{join: type === 1, leave: type === 2, kick: type === 3, ban: type === 4}"
>
<span>
<span class="username"
@ -81,6 +82,14 @@
v-if="type === 2"
class="text"
>has left the server.</span>
<span
v-if="type === 3"
class="text"
>has been kicked.</span>
<span
v-if="type === 4"
class="text"
>has been banned.</span>
<span class="date">{{ getDate }}</span>
</span>
</div>
@ -127,8 +136,8 @@ export default {
},
methods: {
openContextMenu(event) {
const element = event.target;
const {x, y} = element.getBoundingClientRect()
const x = event.clientX;
const y = event.clientY;
this.$store.dispatch('setMessageContext', {
x,
y,
@ -277,16 +286,28 @@ export default {
color: white;
overflow: hidden;
border-radius: 5px;
background: rgba(0, 0, 0, 0.356);
}
.presence-message .text {
margin-left: 5px;
font-size: 15px;
}
.presence-message.green {
background: rgba(0, 128, 0, 0.534);
.presence-message .username {
font-size: 15px;
font-weight: bold
}
.presence-message.red {
background: rgba(128, 0, 0, 0.534);
.presence-message.join {
color: #29BF12;
}
.presence-message.leave {
color: rgb(150, 139, 139);
}
.presence-message.kick {
color: #FF9914;
}
.presence-message.ban {
color: #d92121;
}
.ownMessageLeft {
@ -294,7 +315,7 @@ export default {
}
.ownMessageLeft .triangle-inner {
border-left: 7px solid rgba(184, 184, 184, 0.219);
border-left: 8px solid rgba(184, 184, 184, 0.219);
border-right: none !important;
}
.ownMessageLeft .avatar {
@ -312,7 +333,7 @@ export default {
}
.ownMessage .triangle-inner {
border-right: 7px solid rgba(184, 184, 184, 0.219);
border-right: 8px solid rgba(184, 184, 184, 0.219);
}
.ownMessage .content {
background: rgba(184, 184, 184, 0.219);
@ -366,15 +387,15 @@ export default {
display: flex;
justify-content: bottom;
flex-direction: column;
margin: auto 0 8.7px 0;
margin: auto 0 0 0;
}
.triangle-inner {
width: 0;
height: 0;
border-top: 1px solid transparent;
border-bottom: 7px solid transparent;
border-right: 7px solid rgba(0, 0, 0, 0.301);
.triangle-inner {
width: 0;
height: 0;
border-top: 9px solid transparent;
border-bottom: 0px solid transparent;
border-right: 8px solid rgba(0, 0, 0, 0.301);
}
.content {
@ -384,10 +405,15 @@ export default {
justify-content: center;
flex-direction: column;
border-radius: 10px;
border-bottom-left-radius: 0;
color: rgb(231, 231, 231);
margin: auto 0;
overflow: hidden;
}
.ownMessageLeft .content {
border-bottom-left-radius: 10px;
border-bottom-right-radius: 0;
}
.image-content {
margin-top: 10px;
padding: 5px;
@ -414,16 +440,17 @@ export default {
font-size: 14px;
margin: auto 0;
transition: 0.1s;
cursor: default;
cursor: pointer;
}
.username:hover {
color: rgb(199, 199, 199);
text-decoration: underline;
}
.date {
color: rgb(161, 161, 161);
color: rgb(177, 177, 177);
font-size: 10px;
margin: auto auto auto 5px;
font-weight: normal;
}
.content-message {
word-wrap: break-word;

View file

@ -13,6 +13,7 @@
<server-settings key="ss" v-if="popouts.serverSettings.serverID"/>
<GenericPopout key="gp" v-if="popouts.genericMessage"/>
<message-context-menu key="mcm" v-if="popouts.messageContextMenu.messageID"/>
<server-member-context key="smc" v-if="popouts.serverMemberContext.uniqueID"/>
</transition-group>
</div>
</template>
@ -21,7 +22,12 @@
//popouts
const userInformationPopout = () => import('./Popouts/userInformationPopout.vue');
// context menus
const messageContextMenu = () => import('./Popouts/messageContextMenu');
const ServerMemberContext = () => import('./Popouts/ServerMemberContext');
const AddServer = () => import('./Popouts/AddServer.vue');
const Settings = () => import('./Popouts/Settings.vue');
const TakeSurveyPopout = () => import('./Popouts/TakeSurveyPopout.vue');
@ -48,7 +54,8 @@ export default {
ServerInvite: ServerInvitePopout,
ServerSettings,
GenericPopout,
messageContextMenu
messageContextMenu,
ServerMemberContext
},
data() {
return {

View file

@ -0,0 +1,132 @@
<template>
<div class="drop-down-menu" v-click-outside="outsideClick">
<div class="item" @click="viewProfile" >View Profile</div>
<div class="item" @click="copyUserTag" >Copy User@Tag</div>
<div class="item" @click="copyID" >Copy ID</div>
<div class="item warn" v-if="showKickBanOption" @click="kickMember">Kick</div>
<div class="item warn" v-if="showKickBanOption" @click="banMember">Ban</div>
</div>
</template>
<script>
import messagesService from '@/services/messagesService';
import ServerService from '../../../../services/ServerService';
export default {
data() {
return {
};
},
methods: {
closeMenu() {
this.$store.dispatch('setServerMemberContext', {server_id: null, uniqueID: null, x: null, y: null});
},
outsideClick(event) {
this.closeMenu();
},
viewProfile() {
const uniqueID = this.contextDetails.uniqueID;
this.closeMenu();
this.$store.dispatch("setUserInformationPopout", uniqueID);
},
copyUserTag() {
const user = this.$store.getters['members/members'][this.contextDetails.uniqueID];
const userTag = user.username + "@" + user.tag;
this.closeMenu();
this.$clipboard(userTag);
},
copyID() {
const uniqueID = this.contextDetails.uniqueID;
this.$clipboard(uniqueID);
this.closeMenu();
},
async kickMember() {
const serverID = this.contextDetails.serverID;
const uniqueID = this.contextDetails.uniqueID;
this.closeMenu();
const {ok, error, result} = await ServerService.kickMember(serverID, uniqueID);
},
async banMember() {
const serverID = this.contextDetails.serverID;
const uniqueID = this.contextDetails.uniqueID;
this.closeMenu();
const {ok, error, result} = await ServerService.banMember(serverID, uniqueID);
},
setPosition() {
const y = this.contextDetails.y;
const x = this.contextDetails.x;
this.$el.style.top = y + "px";
this.$el.style.left = x + "px";
}
},
mounted() {
this.setPosition();
},
watch: {
contextDetails() {
this.setPosition();
}
},
computed: {
contextDetails() {
const { x, y, serverID, uniqueID } = this.$store.getters.popouts.serverMemberContext;
return {
x,
y,
serverID,
uniqueID
}
},
serverMember() {
const serverMembers = this.$store.getters['servers/serverMembers'];
return serverMembers.find(m =>
m.uniqueID === this.user.uniqueID && m.server_id === this.contextDetails.serverID && m.type === "OWNER"
)
},
user() {
return this.$store.getters.user;
},
showKickBanOption() {
// Dont show kick and ban option for Fishie and Fullipsp :P
if (this.contextDetails.uniqueID === "763085765093499318" || this.contextDetails.uniqueID === "825242960222351869") return;
// Only show kick and ban option if the user is server owner and not us
if (this.user.uniqueID === this.contextDetails.uniqueID) return false;
return !!this.serverMember;
}
},
};
</script>
<style lang="scss" scoped>
.drop-down-menu {
position: absolute;
top: 0;
left: 0;
background: rgba(31, 31, 31, 0.995);
z-index: 99999;
padding: 5px;
border-radius: 5px;
user-select: none;
color: white;
}
.item {
padding: 5px;
margin: 2px;
border-radius: 5px;
transition: 0.3s;
font-size: 13px;
cursor: pointer;
&:hover {
background: rgb(46, 46, 46);
}
&.warn {
color: rgb(255, 59, 59);
}
}
</style>

View file

@ -0,0 +1,135 @@
<template>
<div class="content">
<div class="content-inner">
<div class="banned-members-list">
<spinner v-if="bans === null"/>
<div class="member" v-for="(ban, index) in bans" :key="index">
<div class="avatar" @click="showProfile(ban.user.uniqueID)" :style="`background-image: url(${avatarDomain + ban.user.avatar})`" />
<div class="details" @click="showProfile(ban.user.uniqueID)">
<div class="username">{{ban.user.username}}</div>
<div class="tag">@{{ban.user.tag}}</div>
</div>
<div class="unban-button" @click="unban(ban.user.uniqueID)">
{{unbanStatus ? 'Unbanning...' : 'Unban'}}
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import config from "@/config.js";
import { bus } from "@/main";
import ServerService from "@/services/ServerService";
import Spinner from "@/components/Spinner";
export default {
components: {Spinner},
data() {
return {
unbanStatus: false,
bans: null,
avatarDomain: config.domain + "/avatars/"
};
},
methods: {
async getBanList() {
const {ok, error, result} = await ServerService.memberBans(this.server.server_id)
if (ok) {
this.bans = result.data;
}
},
async unban(uniqueID) {
this.unbanStatus = true;
const { ok, error, result } = await ServerService.unBanMember(this.server.server_id, uniqueID)
this.unbanStatus = false;
if (ok) {
this.bans = this.bans.filter(b => b.user.uniqueID !== uniqueID)
}
},
showProfile(uniqueID) {
this.$store.dispatch("setUserInformationPopout", uniqueID);
},
},
computed: {
server() {
const serverID = this.$store.state.popoutsModule.serverSettings.serverID;
return this.$store.getters["servers/servers"][serverID];
},
},
mounted() {
this.getBanList();
}
};
</script>
<style scoped lang="scss">
.content-inner {
display: flex;
height: 100%;
position: relative;
}
.banned-members-list {
display: flex;
flex-direction: column;
width: 100%;
height: 100%;
overflow: auto;
.member {
display: flex;
background: rgb(54, 54, 54);
height: 30px;
margin: 5px;
border-radius: 5px;
padding: 5px;
align-content: center;
align-items: center;
flex-shrink: 0;
.avatar {
height: 30px;
width: 30px;
border-radius: 50%;
margin-right: 5px;
flex-shrink: 0;
background-color: rgba(0, 0, 0, 0.315);
background-position: center;
background-size: cover;
background-repeat: no-repeat;
cursor: pointer;
}
.details {
display: flex;
.tag {
color: rgba(255, 255, 255, 0.568);
}
flex: 1;
overflow: hidden;
cursor: pointer;
}
.unban-button {
color: rgb(255, 43, 43);
cursor: pointer;
user-select: none;
flex-shrink: 0;
margin-left: 5px;
}
}
}
</style>

View file

@ -13,8 +13,9 @@
</div>
<general v-if="index === 0"/>
<manage-channels v-if="index === 1"/>
<server-visibility v-if="index === 2"/>
<delete-server v-if="index === 3"/>
<manage-bans v-if="index === 2"/>
<server-visibility v-if="index === 3"/>
<delete-server v-if="index === 4"/>
</div>
</div>
</div>
@ -30,9 +31,10 @@ import { mapState } from "vuex";
import General from './General.vue'
import DeleteServer from './DeleteServer.vue'
import ManageChannels from './ManageChannels.vue'
import ManageBans from './ManageBans.vue'
import ServerVisibility from './ServerVisibility.vue'
export default {
components: { General, DeleteServer, ManageChannels, ServerVisibility},
components: { General, DeleteServer, ManageChannels, ServerVisibility, ManageBans},
data() {
return {
index: 0,
@ -40,6 +42,7 @@ export default {
{title: "General", icon: "info"},
{title: "Manage Channels", icon: "storage"},
// {title: "Manage Invites", icon: "local_post_office"},
{title: "Banned Members", icon: "lock"},
{title: "Server Visibility", icon: "visibility"},
{title: "Delete Server", icon: "warning", critical: true},
]
@ -98,6 +101,7 @@ export default {
height: 100%;
display: flex;
flex-direction: column;
overflow: hidden;
}
.tabs {
display: flex;

View file

@ -115,20 +115,16 @@ export default {
}
.item {
padding: 3px;
padding: 5px;
margin: 2px;
border-radius: 5px;
transition: 0.3s;
font-size: 13px;
cursor: pointer;
&:hover {
background: rgb(56, 56, 56);
background: rgb(46, 46, 46);
}
&.warn {
&:hover {
background: rgba(255, 90, 90, 0.338);
}
background: rgba(255, 90, 90, 0.1);
color: rgb(255, 59, 59);
}
}

View file

@ -179,7 +179,7 @@ export default {
left: 0;
right: 0;
bottom: 0;
z-index: 999;
z-index: 9999999;
display: flex;
justify-content: center;
align-items: center;

View file

@ -49,11 +49,11 @@ export default {
const result = Object.keys(allFriend).map(function(key) {
const friend = allFriend[key];
friend.recipient = members[friend.uniqueID];
const findNotification = notifications.find( e => {
const findNotification = notifications.find( e => {
return e.sender.uniqueID === friend.recipient.uniqueID && !channels[e.channelID].server_id
})
if ( findNotification ){
friend.channelID = findNotification.channelID;
}

View file

@ -4,21 +4,10 @@ export default {
post ( data ) {
return wrapper(instance().post('/servers', data));
},
updateServer (serverID, data) {
return wrapper(instance().patch(`/servers/${serverID}`, data));
},
getChannels(serverID) {
return wrapper(instance().get(`/servers/${serverID}/channels`));
},
createChannel(serverID, name) {
return wrapper(instance().put(`/servers/${serverID}/channels`, {name}));
},
updateChannel (serverID, channelID, data) {
return wrapper(instance().patch(`/servers/${serverID}/channels/${channelID}`, data));
},
deleteChannel (serverID, channelID) {
return wrapper(instance().delete(`/servers/${serverID}/channels/${channelID}`));
},
postInvite (serverID) {
return wrapper (instance().post(`/servers/${serverID}/invite`))
},
@ -38,4 +27,30 @@ export default {
return wrapper (instance().delete(`/servers/${serverID}`))
},
// Admin commands
updateServer (serverID, data) {
return wrapper(instance().patch(`/servers/${serverID}`, data));
},
createChannel(serverID, name) {
return wrapper(instance().put(`/servers/${serverID}/channels`, {name}));
},
updateChannel (serverID, channelID, data) {
return wrapper(instance().patch(`/servers/${serverID}/channels/${channelID}`, data));
},
deleteChannel (serverID, channelID) {
return wrapper(instance().delete(`/servers/${serverID}/channels/${channelID}`));
},
kickMember (serverID, uniqueID) {
return wrapper(instance().delete(`/servers/${serverID}/members/${uniqueID}`));
},
banMember (serverID, uniqueID) {
return wrapper(instance().put(`/servers/${serverID}/bans/${uniqueID}`));
},
unBanMember (serverID, uniqueID) {
return wrapper(instance().delete(`/servers/${serverID}/bans/${uniqueID}`));
},
memberBans (serverID,) {
return wrapper(instance().get(`/servers/${serverID}/bans`));
},
}

View file

@ -114,6 +114,14 @@ const actions = {
}
})
},
deleteAllMessages(context, channelIDArr) {
const messages = Object.assign({}, context.state.messages);
for (let index = 0; index < channelIDArr.length; index++) {
const channelID = channelIDArr[index];
delete messages[channelID]
}
context.commit('setAllMessages', messages)
},
updateMessage(context, {channelID, messageID, message}) {
const messages = context.state.messages[channelID];
messages.find((obj, index) => {
@ -164,6 +172,9 @@ async function getMessages(context, channelID, isServerChannel) {
const mutations = {
setAllMessages(state, messages) {
state.messages = messages;
},
setBottomUnloadStatus(state, {channelID, status}) {
Vue.set(state.bottomUnloaded, channelID, status)
},

View file

@ -36,6 +36,12 @@ const state = {
uniqueID: null,
x: null,
y: null
},
serverMemberContext: {
serverID: null,
uniqueID: null,
x: null,
y: null
}
@ -74,10 +80,16 @@ const actions = {
},
setMessageContext(context, {messageID, x, y, channelID, message, uniqueID}) {
context.commit('setMessageContext', {messageID, x, y, channelID, message, uniqueID});
},
setServerMemberContext(context, {uniqueID, x, y, serverID}) {
context.commit('setServerMemberContext', {uniqueID, x, y, serverID});
}
}
const mutations = {
setServerMemberContext(state, data) {
Vue.set(state, 'serverMemberContext', data);
},
setMessageContext(state, data) {
Vue.set(state, 'messageContextMenu', data);
},

View file

@ -3,6 +3,7 @@ import {bus} from '../../main'
import {router} from './../../router'
import Vue from 'vue';
import DesktopNotification from '@/utils/ElectronJS/DesktopNotification'
import isElectron from '@/utils/ElectronJS/DesktopNotification'
const state = {
@ -175,6 +176,8 @@ const actions = {
// send desktop notification
const disableDesktopNotification = context.rootGetters['settingsModule/settings'].notification.disableDesktopNotification;
if (disableDesktopNotification === true) return
if (!isElectron || disableDesktopNotification === undefined) return;
const channel = context.getters.channels[data.message.channelID];
if (channel && channel.server_id) {
const server = context.getters['servers/servers'][channel.server_id]
@ -267,10 +270,23 @@ const actions = {
},
['socket_server:leave'](context, {server_id}) {
// check if server channel selected
const serverChannelIDs = context.rootState.servers.channelsIDs[server_id];
const selectedChannelID = context.rootState.channelModule.selectedChannelID;
const serverChannelID = context.rootState.channelModule.serverChannelID;
if (serverChannelIDs.includes(selectedChannelID)) {
context.dispatch('selectedChannelID', null)
}
if (serverChannelIDs.includes(serverChannelID)) {
context.dispatch('setServerChannelID', null)
}
context.dispatch('servers/removePresences', server_id);
context.dispatch('servers/removeServer', server_id)
context.dispatch('servers/removeNotifications', server_id)
context.dispatch('servers/removeAllServerChannels', server_id)
context.dispatch('deleteAllMessages', serverChannelIDs)
},
['socket_server:memberAdd'](context, {serverMember, presence}) { // member_add
let sm = Object.assign({}, serverMember);

View file

@ -14,12 +14,36 @@
const config = [
{
version: 7.3,
title: "Kick and ban!",
shortTitle: "",
date: "29/09/2019",
headColor: "rgba(25, 130, 255, 0.77)",
new: [
'You can now kick/back members of a server by right clicking on their names in the server members list.',
'Slightly changed message bubble design.'
],
fix: [
"Fixed a bug where Join and Leave messages would not get notified when reloading client.",
],
},
{
version: 7.2,
title: "Online, offline category in server member list",
shortTitle: "",
date: "21/09/2019",
new: [
"Online and offline is now a category in the server members list.",
"Moved add server to the top of the servers list with new design.",
"Added Explore button to the top of the servers list."
],
},
{
version: 7.1,
title: "Small improvements, bug fixes",
shortTitle: "",
date: "19/09/2019",
headColor: "rgba(25, 130, 255, 0.77)",
new: [
"When joining a server, the tabs should change to servers and default channel should open up.",
"Swapped the changelog and the explore tab."

View file

@ -3,6 +3,7 @@ import Vue from 'vue'
// to close popout menus when clicking outside.
Vue.directive('click-outside', {
bind: function (el, binding, vnode) {
el.clickOutsideEvent = function (event) {
// here I check that click was outside the el and his childrens
if (!(el == event.target || el.contains(event.target))) {

View file

@ -160,9 +160,9 @@ export default {
}
// check if changelog is updated
const seenVersion = localStorage.getItem("changelog-version-seen");
if (!seenVersion || seenVersion < changelog[0].version) {
this.currentTab = 0;
localStorage.setItem("currentTab", 0);
if (seenVersion && seenVersion < changelog[0].version) {
localStorage.setItem("currentTab", 3);
this.currentTab = 3;
}
localStorage.setItem("changelog-version-seen", changelog[0].version);
bus.$on("title:change", title => {