Merge branch 'master' into maddyrtc
This commit is contained in:
		
						commit
						e1f9839685
					
				
							
								
								
									
										45
									
								
								Dockerfile
									
									
									
									
									
								
							
							
						
						
									
										45
									
								
								Dockerfile
									
									
									
									
									
								
							| @ -1,7 +1,40 @@ | |||||||
| FROM node:14 | FROM node:alpine | ||||||
| WORKDIR /usr/src/fosscord-server/ | 
 | ||||||
| COPY . . | # env vars | ||||||
| WORKDIR /usr/src/fosscord-server/bundle | ENV WORK_DIR="/srv/fosscord-server" | ||||||
|  | ENV DEV_MODE=0 | ||||||
|  | ENV HTTP_PORT=3001 | ||||||
|  | ENV WS_PORT=3002 | ||||||
|  | ENV CDN_PORT=3003 | ||||||
|  | ENV RTC_PORT=3004 | ||||||
|  | ENV ADMIN_PORT=3005 | ||||||
|  | 
 | ||||||
|  | # exposed ports (only for reference, see https://docs.docker.com/engine/reference/builder/#expose) | ||||||
|  | EXPOSE ${HTTP_PORT}/tcp ${WS_PORT}/tcp ${CDN_PORT}/tcp ${RTC_PORT}/tcp ${ADMIN_PORT}/tcp | ||||||
|  | 
 | ||||||
|  | # install required apps | ||||||
|  | RUN apk add --no-cache --update git python2 py-pip make build-base | ||||||
|  | 
 | ||||||
|  | # optionl: packages for debugging/development | ||||||
|  | RUN apk add --no-cache sqlite | ||||||
|  | 
 | ||||||
|  | # download fosscord-server | ||||||
|  | WORKDIR $WORK_DIR/src | ||||||
|  | RUN git clone https://github.com/fosscord/fosscord-server.git . | ||||||
|  | 
 | ||||||
|  | # setup and run | ||||||
|  | WORKDIR $WORK_DIR/src/bundle | ||||||
| RUN npm run setup | RUN npm run setup | ||||||
| EXPOSE 3001 | RUN npm install @yukikaze-bot/erlpack | ||||||
| CMD [ "npm", "run", "start:bundle" ] | # RUN npm install mysql --save | ||||||
|  | 
 | ||||||
|  | # create update script | ||||||
|  | RUN printf '#!/bin/sh\n\ngit -C $WORK_DIR/src/ checkout master\ngit -C $WORK_DIR/src/ reset --hard HEAD\ngit -C $WORK_DIR/src/ pull\ncd $WORK_DIR/src/bundle/\nnpm run setup\n' > $WORK_DIR/update.sh | ||||||
|  | RUN chmod +x $WORK_DIR/update.sh | ||||||
|  | 
 | ||||||
|  | # configure entrypoint file | ||||||
|  | RUN printf '#!/bin/sh\n\nDEV_MODE=${DEV_MODE:-0}\n\nif [ "$DEV_MODE" -eq 1 ]; then\n    tail -f /dev/null\nelse\n    cd $WORK_DIR/src/bundle/\n    npm run start:bundle\nfi\n' > $WORK_DIR/entrypoint.sh | ||||||
|  | RUN chmod +x $WORK_DIR/entrypoint.sh | ||||||
|  | 
 | ||||||
|  | WORKDIR $WORK_DIR | ||||||
|  | ENTRYPOINT ["./entrypoint.sh"] | ||||||
|  | |||||||
| @ -3119,7 +3119,7 @@ | |||||||
| 						"type": "boolean" | 						"type": "boolean" | ||||||
| 					}, | 					}, | ||||||
| 					"status": { | 					"status": { | ||||||
| 						"enum": ["dnd", "idle", "offline", "online"], | 						"enum": ["dnd", "idle", "offline", "online", "invisible"], | ||||||
| 						"type": "string" | 						"type": "string" | ||||||
| 					}, | 					}, | ||||||
| 					"stream_notifications_enabled": { | 					"stream_notifications_enabled": { | ||||||
| @ -5677,7 +5677,7 @@ | |||||||
| 						"type": "boolean" | 						"type": "boolean" | ||||||
| 					}, | 					}, | ||||||
| 					"status": { | 					"status": { | ||||||
| 						"enum": ["dnd", "idle", "offline", "online"], | 						"enum": ["dnd", "idle", "offline", "online", "invisible"], | ||||||
| 						"type": "string" | 						"type": "string" | ||||||
| 					}, | 					}, | ||||||
| 					"stream_notifications_enabled": { | 					"stream_notifications_enabled": { | ||||||
|  | |||||||
| @ -7897,7 +7897,7 @@ | |||||||
| 				"type": "boolean" | 				"type": "boolean" | ||||||
| 			}, | 			}, | ||||||
| 			"status": { | 			"status": { | ||||||
| 				"enum": ["dnd", "idle", "offline", "online"], | 				"enum": ["dnd", "idle", "offline", "online", "invisible"], | ||||||
| 				"type": "string" | 				"type": "string" | ||||||
| 			}, | 			}, | ||||||
| 			"stream_notifications_enabled": { | 			"stream_notifications_enabled": { | ||||||
|  | |||||||
| @ -33,17 +33,32 @@ router.get("/", route({ permission: "BAN_MEMBERS" }), async (req: Request, res: | |||||||
| 	const { guild_id } = req.params; | 	const { guild_id } = req.params; | ||||||
| 
 | 
 | ||||||
| 	let bans = await Ban.find({ guild_id: guild_id }); | 	let bans = await Ban.find({ guild_id: guild_id }); | ||||||
|  | 	let promisesToAwait: object[] = []; | ||||||
|  | 	const bansObj: object[] = []; | ||||||
| 
 | 
 | ||||||
| 	/* Filter secret from database registry.*/ | 	bans.filter((ban) => ban.user_id !== ban.executor_id); // pretend self-bans don't exist to prevent victim chasing
 | ||||||
| 
 | 
 | ||||||
| 	bans.filter(ban => ban.user_id !== ban.executor_id); | 	bans.forEach((ban) => { | ||||||
| 	// pretend self-bans don't exist to prevent victim chasing
 | 		promisesToAwait.push(User.getPublicUser(ban.user_id)); | ||||||
| 	 |  | ||||||
| 	bans.forEach((registry: BanRegistrySchema) => { |  | ||||||
| 	delete registry.ip; |  | ||||||
| 	}); | 	}); | ||||||
| 	 | 
 | ||||||
| 	return res.json(bans); | 	const bannedUsers: object[] = await Promise.all(promisesToAwait); | ||||||
|  | 
 | ||||||
|  | 	bans.forEach((ban, index) => { | ||||||
|  | 		const user = bannedUsers[index] as User; | ||||||
|  | 		bansObj.push({ | ||||||
|  | 			reason: ban.reason, | ||||||
|  | 			user: { | ||||||
|  | 				username: user.username, | ||||||
|  | 				discriminator: user.discriminator, | ||||||
|  | 				id: user.id, | ||||||
|  | 				avatar: user.avatar, | ||||||
|  | 				public_flags: user.public_flags | ||||||
|  | 			} | ||||||
|  | 		}); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  | 	return res.json(bansObj); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| router.get("/:user", route({ permission: "BAN_MEMBERS" }), async (req: Request, res: Response) => { | router.get("/:user", route({ permission: "BAN_MEMBERS" }), async (req: Request, res: Response) => { | ||||||
|  | |||||||
| @ -25,13 +25,19 @@ router.patch("/", route({ body: "MemberChangeSchema" }), async (req: Request, re | |||||||
| 
 | 
 | ||||||
| 	const member = await Member.findOneOrFail({ where: { id: member_id, guild_id }, relations: ["roles", "user"] }); | 	const member = await Member.findOneOrFail({ where: { id: member_id, guild_id }, relations: ["roles", "user"] }); | ||||||
| 	const permission = await getPermission(req.user_id, guild_id); | 	const permission = await getPermission(req.user_id, guild_id); | ||||||
|  | 	const everyone = await Role.findOneOrFail({ guild_id: guild_id, name: "@everyone", position: 0 }); | ||||||
| 
 | 
 | ||||||
| 	if (body.roles) { | 	if (body.roles) { | ||||||
| 		permission.hasThrow("MANAGE_ROLES"); | 		permission.hasThrow("MANAGE_ROLES"); | ||||||
|  | 
 | ||||||
|  | 		if (body.roles.indexOf(everyone.id) === -1) body.roles.push(everyone.id); | ||||||
| 		member.roles = body.roles.map((x) => new Role({ id: x })); // foreign key constraint will fail if role doesn't exist
 | 		member.roles = body.roles.map((x) => new Role({ id: x })); // foreign key constraint will fail if role doesn't exist
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	await member.save(); | 	await member.save(); | ||||||
|  | 
 | ||||||
|  | 	member.roles = member.roles.filter((x) => x.id !== everyone.id); | ||||||
|  | 
 | ||||||
| 	// do not use promise.all as we have to first write to db before emitting the event to catch errors
 | 	// do not use promise.all as we have to first write to db before emitting the event to catch errors
 | ||||||
| 	await emitEvent({ | 	await emitEvent({ | ||||||
| 		event: "GUILD_MEMBER_UPDATE", | 		event: "GUILD_MEMBER_UPDATE", | ||||||
|  | |||||||
| @ -6,9 +6,9 @@ const router: Router = Router(); | |||||||
| router.put("/:id", route({}), async (req: Request, res: Response) => { | router.put("/:id", route({}), async (req: Request, res: Response) => { | ||||||
| 	//TODO
 | 	//TODO
 | ||||||
| 	res.json({ | 	res.json({ | ||||||
| 		message: "400: Bad Request", | 		message: "Unknown User", | ||||||
| 		code: 0 | 		code: 10013 | ||||||
| 	}).status(400); | 	}).status(404); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| export default router; | export default router; | ||||||
|  | |||||||
| @ -1,7 +1,47 @@ | |||||||
| version: "3" | version: '3.8' | ||||||
|  | 
 | ||||||
| services: | services: | ||||||
|   server: |   fosscord: | ||||||
|     image: fosscord/server |     container_name: fosscord | ||||||
|  |     image: fosscord | ||||||
|  |     restart: on-failure:5 | ||||||
|  |     # depends_on: mariadb | ||||||
|     build: . |     build: . | ||||||
|     ports: |     ports: | ||||||
|       - 3001:3001 |       - '3001-3005:3001-3005' | ||||||
|  |     volumes: | ||||||
|  |       # - ./data/:${WORK_DIR:-/srv/fosscord-server}/data/ | ||||||
|  |       - data:${WORK_DIR:-/srv/fosscord-server}/ | ||||||
|  |     environment: | ||||||
|  |       WORK_DIR: ${WORK_DIR:-/srv/fosscord-server} | ||||||
|  |       DEV_MODE: ${DEV_MODE:-0} | ||||||
|  |       THREADS: ${THREADS:-1} | ||||||
|  |       DATABASE: ${DATABASE:-../../data/database.db} | ||||||
|  |       STORAGE_LOCATION: ${STORAGE_LOCATION:-../../data/files/} | ||||||
|  |       HTTP_PORT: 3001 | ||||||
|  |       WS_PORT: 3002 | ||||||
|  |       CDN_PORT: 3003 | ||||||
|  |       RTC_PORT: 3004 | ||||||
|  |       ADMIN_PORT: 3005 | ||||||
|  | 
 | ||||||
|  |   # mariadb: | ||||||
|  |   #   image: mariadb:latest | ||||||
|  |   #   restart: on-failure:5 | ||||||
|  |   #   environment: | ||||||
|  |   #     MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-secr3tpassw0rd} | ||||||
|  |   #     MYSQL_DATABASE: ${MYSQL_DATABASE:-fosscord} | ||||||
|  |   #     MYSQL_USER: ${MYSQL_USER:-fosscord} | ||||||
|  |   #     MYSQL_PASSWORD: ${MYSQL_PASSWORD:-password1} | ||||||
|  |   #   networks: | ||||||
|  |   #     - default | ||||||
|  |   #   volumes: | ||||||
|  |   #     - mariadb:/var/lib/mysql | ||||||
|  | 
 | ||||||
|  | volumes: | ||||||
|  |   data: | ||||||
|  |   # mariadb: | ||||||
|  | 
 | ||||||
|  | networks: | ||||||
|  |   default: | ||||||
|  |     name: fosscord | ||||||
|  |     driver: bridge | ||||||
|  | |||||||
| @ -240,8 +240,6 @@ export async function onIdentify(this: WebSocket, data: Payload) { | |||||||
| 			x.guild_hashes = {}; // @ts-ignore
 | 			x.guild_hashes = {}; // @ts-ignore
 | ||||||
| 			x.guild_scheduled_events = []; // @ts-ignore
 | 			x.guild_scheduled_events = []; // @ts-ignore
 | ||||||
| 			x.threads = []; | 			x.threads = []; | ||||||
| 			x.premium_subscription_count = 30; |  | ||||||
| 			x.premium_tier = 3; |  | ||||||
| 			return x; | 			return x; | ||||||
| 		}), | 		}), | ||||||
| 		guild_experiments: [], // TODO
 | 		guild_experiments: [], // TODO
 | ||||||
|  | |||||||
| @ -85,7 +85,7 @@ export class Member extends BaseClassWithoutId { | |||||||
| 	@Column() | 	@Column() | ||||||
| 	joined_at: Date; | 	joined_at: Date; | ||||||
| 
 | 
 | ||||||
| 	@Column({ nullable: true }) | 	@Column({ type: "bigint", nullable: true }) | ||||||
| 	premium_since?: number; | 	premium_since?: number; | ||||||
| 
 | 
 | ||||||
| 	@Column() | 	@Column() | ||||||
| @ -245,7 +245,7 @@ export class Member extends BaseClassWithoutId { | |||||||
| 			nick: undefined, | 			nick: undefined, | ||||||
| 			roles: [guild_id], // @everyone role
 | 			roles: [guild_id], // @everyone role
 | ||||||
| 			joined_at: new Date(), | 			joined_at: new Date(), | ||||||
| 			premium_since: new Date(), | 			premium_since: (new Date()).getTime(), | ||||||
| 			deaf: false, | 			deaf: false, | ||||||
| 			mute: false, | 			mute: false, | ||||||
| 			pending: false, | 			pending: false, | ||||||
|  | |||||||
| @ -360,7 +360,7 @@ export interface UserSettings { | |||||||
| 	render_reactions: boolean; | 	render_reactions: boolean; | ||||||
| 	restricted_guilds: string[]; | 	restricted_guilds: string[]; | ||||||
| 	show_current_game: boolean; | 	show_current_game: boolean; | ||||||
| 	status: "online" | "offline" | "dnd" | "idle"; | 	status: "online" | "offline" | "dnd" | "idle" | "invisible"; | ||||||
| 	stream_notifications_enabled: boolean; | 	stream_notifications_enabled: boolean; | ||||||
| 	theme: "dark" | "white"; // dark
 | 	theme: "dark" | "white"; // dark
 | ||||||
| 	timezone_offset: number; // e.g -60
 | 	timezone_offset: number; // e.g -60
 | ||||||
|  | |||||||
| @ -1,4 +1,4 @@ | |||||||
| export type Status = "idle" | "dnd" | "online" | "offline"; | export type Status = "idle" | "dnd" | "online" | "offline" | "invisible"; | ||||||
| 
 | 
 | ||||||
| export interface ClientStatus { | export interface ClientStatus { | ||||||
| 	desktop?: string; // e.g. Windows/Linux/Mac
 | 	desktop?: string; // e.g. Windows/Linux/Mac
 | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Madeline
						Madeline