mute user works, not forever so far
This commit is contained in:
@@ -1,15 +1,14 @@
|
||||
import { Controller, UseGuards, HttpException, HttpStatus, Get, Post, Delete, Body, Req, Res } from '@nestjs/common';
|
||||
import { AuthenticateGuard, TwoFactorGuard } from 'src/auth/42/guards/42guards';
|
||||
import { ConnectedSocket } from '@nestjs/websockets';
|
||||
import { ChatService } from './chat.service';
|
||||
import { User } from 'src/users/entities/user.entity';
|
||||
import { PartialUsersDto } from 'src/users/dto/partial-users.dto';
|
||||
import { roomDto } from './dto/room.dto';
|
||||
import { setCurrentRoomDto } from './dto/setCurrentRoom.dto';
|
||||
import { ChatGateway } from './chat.gateway';
|
||||
import { socketDto } from './dto/socket.dto';
|
||||
import { Chatroom } from './entities/chatroom.entity';
|
||||
import { socketDto } from './dto/socket.dto';
|
||||
import { roomDto } from './dto/room.dto';
|
||||
import { printCaller } from './dev/dev_utils';
|
||||
import { setCurrentRoomDto } from './dto/setCurrentRoom.dto';
|
||||
import { muteDto } from './dto/mute.dto';
|
||||
|
||||
@Controller('chat')
|
||||
export class ChatController {
|
||||
@@ -451,9 +450,37 @@ export class ChatController {
|
||||
|
||||
const room_name = await this.chatService.getCurrentRoomName(req.user.username);
|
||||
const users = await this.chatService.getAllUsersNotInRoom(room_name);
|
||||
|
||||
res.status(HttpStatus.OK).json({ users: users });
|
||||
printCaller("- out ");
|
||||
}
|
||||
|
||||
@UseGuards(AuthenticateGuard)
|
||||
@UseGuards(TwoFactorGuard)
|
||||
@Post('setmute')
|
||||
async setMuteUser(@Body('mute') mute: muteDto, @Body('time') time: string, @Req() req, @Res() res): Promise<void>
|
||||
{
|
||||
printCaller("- in ");
|
||||
|
||||
console.log("mute:", mute);
|
||||
|
||||
const room_name = await this.chatService.getCurrentRoomName(req.user.username);
|
||||
await this.chatService.addMute(req.user.username, room_name, mute);
|
||||
|
||||
// inform other connected users
|
||||
let message = `${req.user.username} has muted ${mute.name} untill ${time}`;
|
||||
let socket: socketDto = this.chatGateway.sockets.get(req.user.username);
|
||||
let server = this.chatGateway.server;
|
||||
await this.chatService.addMessageToRoom(room_name, "SERVER", message);
|
||||
await server.in(socket.room).emit('message', "SERVER", message);
|
||||
//await server.to(socket.id).emit('muted');
|
||||
|
||||
const room = await this.chatService.getRoomByName(room_name);
|
||||
console.log("room:", room);
|
||||
|
||||
res.status(HttpStatus.OK).json({ message: message });
|
||||
printCaller("- out ");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ import { messagesDto } from './dto/messages.dto';
|
||||
import { socketDto } from './dto/socket.dto';
|
||||
import * as bcrypt from 'bcrypt';
|
||||
import { printCaller } from './dev/dev_utils';
|
||||
import { muteDto } from './dto/mute.dto';
|
||||
|
||||
|
||||
@Injectable()
|
||||
@@ -353,9 +354,42 @@ export class ChatService {
|
||||
message: message,
|
||||
};
|
||||
my_room.messages.push(chat_message);
|
||||
await this.chatroomRepository.save(my_room);
|
||||
|
||||
printCaller("-- out ");
|
||||
}
|
||||
|
||||
async addMute(username: string, room_name: string, mute: muteDto): Promise<void>
|
||||
{
|
||||
printCaller("-- in ");
|
||||
|
||||
const room_db = await this.getRoomByName(room_name);
|
||||
|
||||
if (!room_db.admins.includes(username))
|
||||
{
|
||||
console.log("throw error: error: true, code: 'NO_ADMIN', message: 'only admins are allowed to set or modify mute time'");
|
||||
throw new HttpException({ error: true, code: 'NO_ADMIN', message: `only admins are allowed to set or modify mute time` }, HttpStatus.FORBIDDEN);
|
||||
}
|
||||
|
||||
if (!room_db.mutes)
|
||||
room_db.mutes = [mute];
|
||||
else
|
||||
{
|
||||
let already_here = false;
|
||||
room_db.mutes.forEach(mute_elem =>
|
||||
{
|
||||
if (mute_elem.name === mute.name)
|
||||
{
|
||||
already_here = true;
|
||||
mute_elem.date = mute.date;
|
||||
}
|
||||
});
|
||||
if (!already_here)
|
||||
room_db.mutes.push(mute);
|
||||
}
|
||||
await this.chatroomRepository.save(room_db);
|
||||
|
||||
printCaller("-- out ");
|
||||
await this.chatroomRepository.save(my_room);
|
||||
}
|
||||
|
||||
|
||||
@@ -387,6 +421,21 @@ export class ChatService {
|
||||
return "successfully leaving room";
|
||||
}
|
||||
|
||||
async removeMute(username: string, room_name: string): Promise<void>
|
||||
{
|
||||
printCaller("-- in ");
|
||||
|
||||
const room_db = await this.getRoomByName(room_name);
|
||||
|
||||
let index = room_db.mutes.findIndex(mute => mute.name === username);
|
||||
if (index > -1)
|
||||
room_db.mutes.splice(index, 1);
|
||||
|
||||
await this.chatroomRepository.save(room_db);
|
||||
|
||||
printCaller("-- out ");
|
||||
}
|
||||
|
||||
|
||||
/* SEARCH IN USER *****************************************
|
||||
*/
|
||||
@@ -455,7 +504,6 @@ export class ChatService {
|
||||
|
||||
let room_name = await this.getCurrentRoomName(socket.username);
|
||||
|
||||
/*
|
||||
const current_room = await this.getRoomByName(room_name);
|
||||
|
||||
if (current_room.protection)
|
||||
@@ -466,7 +514,23 @@ export class ChatService {
|
||||
return;
|
||||
}
|
||||
}
|
||||
*/
|
||||
if (current_room.mutes)
|
||||
{
|
||||
let current_mute = current_room.mutes.find(mute => mute.name === socket.username);
|
||||
if (current_mute)
|
||||
{
|
||||
const date_now = new Date();
|
||||
const date_mute = new Date(current_mute.date);
|
||||
const date_diff = date_mute.getTime() - date_now.getTime();
|
||||
if (date_diff > 0)
|
||||
{
|
||||
socket.emit('message', "SERVER", "your message was not sent because you are muted");
|
||||
return;
|
||||
}
|
||||
else
|
||||
await this.removeMute(current_mute.name, room_name);
|
||||
}
|
||||
}
|
||||
|
||||
socket.to(socket.room).emit('message', socket.username, message);
|
||||
await this.addMessageToRoom(room_name, socket.username, message);
|
||||
|
||||
13
srcs/requirements/nestjs/api_back/src/chat/dto/mute.dto.ts
Normal file
13
srcs/requirements/nestjs/api_back/src/chat/dto/mute.dto.ts
Normal file
@@ -0,0 +1,13 @@
|
||||
import { IsNotEmpty, IsString, IsDate } from "class-validator";
|
||||
|
||||
export class muteDto
|
||||
{
|
||||
@IsString()
|
||||
@IsNotEmpty()
|
||||
name: string;
|
||||
|
||||
@IsDate()
|
||||
date: Date;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
import { Entity, Column, ManyToOne, ManyToMany, JoinTable, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { Entity, Column, CreateDateColumn, ManyToOne, ManyToMany, JoinTable, PrimaryGeneratedColumn } from "typeorm";
|
||||
import { IsBoolean, IsEmpty, IsInt, IsIn, IsNotEmpty, IsNumber, IsArray, IsString, IsOptional, IsEnum } from "class-validator";
|
||||
import { Exclude, Expose } from 'class-transformer';
|
||||
import { User } from 'src/users/entities/user.entity';
|
||||
import { messagesDto } from 'src/chat/dto/messages.dto';
|
||||
import { muteDto } from 'src/chat/dto/mute.dto';
|
||||
|
||||
@Entity('chatroom')
|
||||
export class Chatroom
|
||||
@@ -50,5 +51,9 @@ export class Chatroom
|
||||
|
||||
@Column("json")
|
||||
messages: messagesDto[];
|
||||
|
||||
@Column("json", { nullable: true })
|
||||
@IsOptional()
|
||||
mutes?: muteDto[];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,10 +1,75 @@
|
||||
<script>
|
||||
<script lang="ts">
|
||||
|
||||
import { layout } from './Store_chat';
|
||||
import { layout, settings_user } from './Store_chat';
|
||||
import { setMute } from './Request_rooms';
|
||||
import Button from './Element_button.svelte';
|
||||
import Warning from './Element_warning.svelte';
|
||||
|
||||
export let back = "";
|
||||
|
||||
let response: FetchResponse;
|
||||
let show_error = false;
|
||||
|
||||
let minutes: number = 0;
|
||||
let hours: number = 0;
|
||||
let days: number = 0;
|
||||
|
||||
async function handleSubmit(evt)
|
||||
{
|
||||
let formIsValid = evt.target.checkValidity();
|
||||
|
||||
if (!formIsValid)
|
||||
return;
|
||||
|
||||
console.log("minutes:", minutes);
|
||||
console.log("hours:", hours);
|
||||
console.log("days:", days);
|
||||
|
||||
let duration = minutes * (1000 * 60) + hours * (1000 * 60 * 60) + days * (1000 * 60 * 60 * 24);
|
||||
console.log("duration:", duration);
|
||||
|
||||
let date_start = new Date();
|
||||
let date_limit = new Date(date_start.getTime() + duration);
|
||||
let time: string = `${date_limit.getFullYear()}/${date_limit.getMonth() + 1}/${date_limit.getDate()} at ${date_limit.getHours()}:${date_limit.getMinutes()}`;
|
||||
console.log("time:", time);
|
||||
|
||||
response = await setMute(date_limit, $settings_user, time);
|
||||
// print error
|
||||
if (response.status >= 300 || response.error)
|
||||
show_error = response.error;
|
||||
|
||||
layout.set("room");
|
||||
|
||||
/*
|
||||
function remaining_time()
|
||||
{
|
||||
const seconds_elem = document.getElementById("add");
|
||||
const seconds_value = seconds_elem.value;
|
||||
if (seconds_value)
|
||||
{
|
||||
date_start = new Date();
|
||||
date_limit = new Date(date_start.getTime() + seconds_value * 1000);
|
||||
seconds_elem.value = "";
|
||||
}
|
||||
else if (!date_start)
|
||||
return;
|
||||
|
||||
const now_date = new Date();
|
||||
const date_diff = date_limit - now_date;
|
||||
|
||||
const diff = `
|
||||
${Math.floor(date_diff / (1000 * 1 * 60 * 60 * 24))}d
|
||||
${Math.floor(date_diff / (1000 * 1 * 60 * 60))}h
|
||||
${Math.floor(date_diff / (1000 * 1 * 60))}m
|
||||
${Math.floor(date_diff / (1000 * 1))}s`;
|
||||
document.getElementById("limit").innerHTML = diff.toString();
|
||||
|
||||
document.getElementById("remains").innerHTML = date_diff > 0;
|
||||
}
|
||||
*/
|
||||
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
<div class="grid_box">
|
||||
@@ -16,7 +81,7 @@
|
||||
|
||||
<!-- user -->
|
||||
<Button my_class="user deactivate">
|
||||
<user>
|
||||
{$settings_user}
|
||||
</Button>
|
||||
|
||||
<!-- close -->
|
||||
@@ -25,11 +90,12 @@
|
||||
</Button>
|
||||
|
||||
<!-- panel_mute -->
|
||||
|
||||
<!-- MUTE -->
|
||||
<div class="panel panel_mute __border_top">
|
||||
{#if show_error}
|
||||
<Warning content={response.message}/>
|
||||
{/if}
|
||||
<p class="__center">mute this user for a time :</p>
|
||||
<form>
|
||||
<form on:submit|preventDefault={handleSubmit}>
|
||||
<!-- forever -->
|
||||
<input id="chat_mute_forever" class="__check_change_next" type="checkbox">
|
||||
<label for="chat_mute_forever" class="_checkbox"><p>forever</p></label>
|
||||
@@ -37,143 +103,143 @@
|
||||
<!-- minutes -->
|
||||
<label for="chat_mute_minutes" class="_select">
|
||||
<p>minutes :</p>
|
||||
<select id="chat_mute_minutes">
|
||||
<option value="01">00</option>
|
||||
<option value="01">01</option>
|
||||
<option value="02">02</option>
|
||||
<option value="03">03</option>
|
||||
<option value="04">04</option>
|
||||
<option value="05">05</option>
|
||||
<option value="06">06</option>
|
||||
<option value="07">07</option>
|
||||
<option value="10">10</option>
|
||||
<option value="11">11</option>
|
||||
<option value="12">12</option>
|
||||
<option value="13">13</option>
|
||||
<option value="14">14</option>
|
||||
<option value="15">15</option>
|
||||
<option value="16">16</option>
|
||||
<option value="17">17</option>
|
||||
<option value="20">20</option>
|
||||
<option value="21">21</option>
|
||||
<option value="22">22</option>
|
||||
<option value="23">23</option>
|
||||
<option value="24">24</option>
|
||||
<option value="25">25</option>
|
||||
<option value="26">26</option>
|
||||
<option value="27">27</option>
|
||||
<option value="30">30</option>
|
||||
<option value="31">31</option>
|
||||
<option value="32">32</option>
|
||||
<option value="33">33</option>
|
||||
<option value="34">34</option>
|
||||
<option value="35">35</option>
|
||||
<option value="36">36</option>
|
||||
<option value="37">37</option>
|
||||
<option value="40">40</option>
|
||||
<option value="41">41</option>
|
||||
<option value="42">42</option>
|
||||
<option value="43">43</option>
|
||||
<option value="44">44</option>
|
||||
<option value="45">45</option>
|
||||
<option value="46">46</option>
|
||||
<option value="47">47</option>
|
||||
<option value="50">50</option>
|
||||
<option value="51">51</option>
|
||||
<option value="52">52</option>
|
||||
<option value="53">53</option>
|
||||
<option value="54">54</option>
|
||||
<option value="55">55</option>
|
||||
<option value="56">56</option>
|
||||
<option value="57">57</option>
|
||||
<option value="60">60</option>
|
||||
<select id="chat_mute_minutes" bind:value={minutes}>
|
||||
<option>00</option>
|
||||
<option>01</option>
|
||||
<option>02</option>
|
||||
<option>03</option>
|
||||
<option>04</option>
|
||||
<option>05</option>
|
||||
<option>06</option>
|
||||
<option>07</option>
|
||||
<option>10</option>
|
||||
<option>11</option>
|
||||
<option>12</option>
|
||||
<option>13</option>
|
||||
<option>14</option>
|
||||
<option>15</option>
|
||||
<option>16</option>
|
||||
<option>17</option>
|
||||
<option>20</option>
|
||||
<option>21</option>
|
||||
<option>22</option>
|
||||
<option>23</option>
|
||||
<option>24</option>
|
||||
<option>25</option>
|
||||
<option>26</option>
|
||||
<option>27</option>
|
||||
<option>30</option>
|
||||
<option>31</option>
|
||||
<option>32</option>
|
||||
<option>33</option>
|
||||
<option>34</option>
|
||||
<option>35</option>
|
||||
<option>36</option>
|
||||
<option>37</option>
|
||||
<option>40</option>
|
||||
<option>41</option>
|
||||
<option>42</option>
|
||||
<option>43</option>
|
||||
<option>44</option>
|
||||
<option>45</option>
|
||||
<option>46</option>
|
||||
<option>47</option>
|
||||
<option>50</option>
|
||||
<option>51</option>
|
||||
<option>52</option>
|
||||
<option>53</option>
|
||||
<option>54</option>
|
||||
<option>55</option>
|
||||
<option>56</option>
|
||||
<option>57</option>
|
||||
<option>60</option>
|
||||
</select>
|
||||
</label>
|
||||
<!-- hours -->
|
||||
<label for="chat_mute_hours" class="_select">
|
||||
<p>hours :</p>
|
||||
<select id="chat_mute_hours">
|
||||
<option value="01">00</option>
|
||||
<option value="01">01</option>
|
||||
<option value="02">02</option>
|
||||
<option value="03">03</option>
|
||||
<option value="04">04</option>
|
||||
<option value="05">05</option>
|
||||
<option value="06">06</option>
|
||||
<option value="07">07</option>
|
||||
<option value="10">10</option>
|
||||
<option value="11">11</option>
|
||||
<option value="12">12</option>
|
||||
<option value="13">13</option>
|
||||
<option value="14">14</option>
|
||||
<option value="15">15</option>
|
||||
<option value="16">16</option>
|
||||
<option value="17">17</option>
|
||||
<option value="20">20</option>
|
||||
<option value="21">21</option>
|
||||
<option value="22">22</option>
|
||||
<option value="23">23</option>
|
||||
<option value="24">24</option>
|
||||
<option value="25">25</option>
|
||||
<option value="26">26</option>
|
||||
<option value="27">27</option>
|
||||
<option value="30">30</option>
|
||||
<option value="31">31</option>
|
||||
<option value="32">32</option>
|
||||
<option value="33">33</option>
|
||||
<option value="34">34</option>
|
||||
<option value="35">35</option>
|
||||
<option value="36">36</option>
|
||||
<option value="37">37</option>
|
||||
<option value="40">40</option>
|
||||
<option value="41">41</option>
|
||||
<option value="42">42</option>
|
||||
<option value="43">43</option>
|
||||
<option value="44">44</option>
|
||||
<option value="45">45</option>
|
||||
<option value="46">46</option>
|
||||
<option value="47">47</option>
|
||||
<option value="50">50</option>
|
||||
<option value="51">51</option>
|
||||
<option value="52">52</option>
|
||||
<option value="53">53</option>
|
||||
<option value="54">54</option>
|
||||
<option value="55">55</option>
|
||||
<option value="56">56</option>
|
||||
<option value="57">57</option>
|
||||
<option value="60">60</option>
|
||||
<option>00</option>
|
||||
<option>01</option>
|
||||
<option>02</option>
|
||||
<option>03</option>
|
||||
<option>04</option>
|
||||
<option>05</option>
|
||||
<option>06</option>
|
||||
<option>07</option>
|
||||
<option>10</option>
|
||||
<option>11</option>
|
||||
<option>12</option>
|
||||
<option>13</option>
|
||||
<option>14</option>
|
||||
<option>15</option>
|
||||
<option>16</option>
|
||||
<option>17</option>
|
||||
<option>20</option>
|
||||
<option>21</option>
|
||||
<option>22</option>
|
||||
<option>23</option>
|
||||
<option>24</option>
|
||||
<option>25</option>
|
||||
<option>26</option>
|
||||
<option>27</option>
|
||||
<option>30</option>
|
||||
<option>31</option>
|
||||
<option>32</option>
|
||||
<option>33</option>
|
||||
<option>34</option>
|
||||
<option>35</option>
|
||||
<option>36</option>
|
||||
<option>37</option>
|
||||
<option>40</option>
|
||||
<option>41</option>
|
||||
<option>42</option>
|
||||
<option>43</option>
|
||||
<option>44</option>
|
||||
<option>45</option>
|
||||
<option>46</option>
|
||||
<option>47</option>
|
||||
<option>50</option>
|
||||
<option>51</option>
|
||||
<option>52</option>
|
||||
<option>53</option>
|
||||
<option>54</option>
|
||||
<option>55</option>
|
||||
<option>56</option>
|
||||
<option>57</option>
|
||||
<option>60</option>
|
||||
</select>
|
||||
</label>
|
||||
<!-- days -->
|
||||
<label for="chat_mute_days" class="_select">
|
||||
<p>days :</p>
|
||||
<select id="chat_mute_days">
|
||||
<option value="00">00</option>
|
||||
<option value="01">01</option>
|
||||
<option value="02">02</option>
|
||||
<option value="03">03</option>
|
||||
<option value="04">04</option>
|
||||
<option value="05">05</option>
|
||||
<option value="06">06</option>
|
||||
<option value="07">07</option>
|
||||
<option value="10">10</option>
|
||||
<option value="11">11</option>
|
||||
<option value="12">12</option>
|
||||
<option value="13">13</option>
|
||||
<option value="14">14</option>
|
||||
<option value="15">15</option>
|
||||
<option value="16">16</option>
|
||||
<option value="17">17</option>
|
||||
<option value="20">20</option>
|
||||
<option value="21">21</option>
|
||||
<option value="22">22</option>
|
||||
<option value="23">23</option>
|
||||
<option value="24">24</option>
|
||||
<option value="25">25</option>
|
||||
<option value="26">26</option>
|
||||
<option value="27">27</option>
|
||||
<option value="30">30</option>
|
||||
<option value="31">31</option>
|
||||
<option>00</option>
|
||||
<option>01</option>
|
||||
<option>02</option>
|
||||
<option>03</option>
|
||||
<option>04</option>
|
||||
<option>05</option>
|
||||
<option>06</option>
|
||||
<option>07</option>
|
||||
<option>10</option>
|
||||
<option>11</option>
|
||||
<option>12</option>
|
||||
<option>13</option>
|
||||
<option>14</option>
|
||||
<option>15</option>
|
||||
<option>16</option>
|
||||
<option>17</option>
|
||||
<option>20</option>
|
||||
<option>21</option>
|
||||
<option>22</option>
|
||||
<option>23</option>
|
||||
<option>24</option>
|
||||
<option>25</option>
|
||||
<option>26</option>
|
||||
<option>27</option>
|
||||
<option>30</option>
|
||||
<option>31</option>
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
@@ -40,10 +40,6 @@
|
||||
show_error = response.error;
|
||||
layout.set("room");
|
||||
}
|
||||
async function ban_mute_user()
|
||||
{
|
||||
to_print("in ban_mute_user");
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
@@ -88,7 +84,7 @@
|
||||
<Button on:click={make_user_admin}>
|
||||
make admin
|
||||
</Button>
|
||||
<Button on:click={ban_mute_user}>
|
||||
<Button new_layout="mute">
|
||||
{mute}
|
||||
</Button>
|
||||
{/if}
|
||||
|
||||
@@ -165,7 +165,7 @@ export async function leave_room(): Promise<void>
|
||||
let response: FetchResponse = await fetch_chat_request('leave', FetchMethod.DELETE);
|
||||
}
|
||||
|
||||
export async function make_admin(username): Promise<boolean>
|
||||
export async function make_admin(username): Promise<FetchResponse>
|
||||
{
|
||||
to_print("in is_admin");
|
||||
|
||||
@@ -186,3 +186,24 @@ to_print("is_admin return:", response.is_admin);
|
||||
return response.is_admin;
|
||||
}
|
||||
|
||||
export async function setMute(date_limit: Date, username: string, time: string): Promise<FetchResponse>
|
||||
{
|
||||
to_print("in is_admin");
|
||||
|
||||
let body =
|
||||
{
|
||||
mute:
|
||||
{
|
||||
name: username,
|
||||
date: date_limit,
|
||||
},
|
||||
time: time,
|
||||
}
|
||||
|
||||
to_print("setmute send body:", body);
|
||||
let response: FetchResponse = await fetch_chat_request('setmute', FetchMethod.POST, body );
|
||||
to_print("setmute return:", response);
|
||||
|
||||
return response;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user