Merge branch 'master' into slowcord
This commit is contained in:
		
						commit
						6972dac560
					
				| @ -2,7 +2,7 @@ | ||||
| 	"openapi": "3.0.0", | ||||
| 	"servers": [ | ||||
| 		{ | ||||
| 			"url": "https://api.fosscord.com/v{version}", | ||||
| 			"url": "https://api.fosscord.com/api/v{version}", | ||||
| 			"description": "Official fosscord instance", | ||||
| 			"variables": { | ||||
| 				"version": { | ||||
| @ -2960,7 +2960,7 @@ | ||||
| 					"type": { | ||||
| 						"type": "string" | ||||
| 					}, | ||||
| 					"verifie": { | ||||
| 					"verified": { | ||||
| 						"type": "boolean" | ||||
| 					}, | ||||
| 					"visibility": { | ||||
| @ -2980,7 +2980,7 @@ | ||||
| 					"type", | ||||
| 					"user", | ||||
| 					"user_id", | ||||
| 					"verifie", | ||||
| 					"verified", | ||||
| 					"visibility" | ||||
| 				] | ||||
| 			}, | ||||
|  | ||||
							
								
								
									
										12
									
								
								api/assets/preload-plugins/fosscord-login.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								api/assets/preload-plugins/fosscord-login.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,12 @@ | ||||
| // Remove `<link id="logincss" rel="stylesheet" href="/assets/fosscord-login.css" />` from header when we're not accessing `/login` or `/register`
 | ||||
| // fosscord-login.css replaces discord's TOS tooltip with something more fitting for fosscord, which when included in the main app, causes other tooltips
 | ||||
| // to be affected, which is potentially unwanted.
 | ||||
| //
 | ||||
| // This script removes fosscord-login.css when a user reloads the page. From testing, it appears fosscord already properly removes
 | ||||
| // fosscord-login.css after login is successful, but not if you reload the page after logging in. This script is to remove fosscord-login.css in
 | ||||
| // that specific case.
 | ||||
| 
 | ||||
| var token = JSON.parse(localStorage.getItem("token")); | ||||
| if (!token && location.pathname !== "/login" && location.pathname !== "/register") { | ||||
| 	document.getElementById("logincss").remove(); | ||||
| } | ||||
| @ -355,11 +355,11 @@ | ||||
| 					"type": { | ||||
| 						"type": "string" | ||||
| 					}, | ||||
| 					"verifie": { | ||||
| 					"verified": { | ||||
| 						"type": "boolean" | ||||
| 					} | ||||
| 				}, | ||||
| 				"required": ["name", "type", "verifie"] | ||||
| 				"required": ["name", "type", "verified"] | ||||
| 			} | ||||
| 		}, | ||||
| 		"$schema": "http://json-schema.org/draft-07/schema#" | ||||
|  | ||||
| @ -14,12 +14,12 @@ import { Webhook } from "./Webhook"; | ||||
| import { DmChannelDTO } from "../dtos"; | ||||
| 
 | ||||
| export enum ChannelType { | ||||
| 	GUILD_TEXT = 0, // a text channel within a server
 | ||||
| 	GUILD_TEXT = 0, // a text channel within a guild
 | ||||
| 	DM = 1, // a direct message between users
 | ||||
| 	GUILD_VOICE = 2, // a voice channel within a server
 | ||||
| 	GUILD_VOICE = 2, // a voice channel within a guild
 | ||||
| 	GROUP_DM = 3, // a direct message between multiple users
 | ||||
| 	GUILD_CATEGORY = 4, // an organizational category that contains up to 50 channels
 | ||||
| 	GUILD_NEWS = 5, // a channel that users can follow and crosspost into their own server
 | ||||
| 	GUILD_CATEGORY = 4, // an organizational category that contains zero or more channels
 | ||||
| 	GUILD_NEWS = 5, // a channel that users can follow and crosspost into a guild or route
 | ||||
| 	GUILD_STORE = 6, // a channel in which game developers can sell their game on Discord
 | ||||
| 	ENCRYPTED = 7, // end-to-end encrypted channel
 | ||||
| 	ENCRYPTED_THREAD = 8, // end-to-end encrypted thread channel
 | ||||
| @ -72,7 +72,7 @@ export class Channel extends BaseClass { | ||||
| 	@ManyToOne(() => Channel) | ||||
| 	parent?: Channel; | ||||
| 
 | ||||
| 	// only for group dms
 | ||||
| 	// for group DMs and owned custom channel types
 | ||||
| 	@Column({ nullable: true }) | ||||
| 	@RelationId((channel: Channel) => channel.owner) | ||||
| 	owner_id: string; | ||||
| @ -117,6 +117,9 @@ export class Channel extends BaseClass { | ||||
| 	}) | ||||
| 	invites?: Invite[]; | ||||
| 
 | ||||
| 	@Column({ nullable: true }) | ||||
| 	retention_policy_id?: string; | ||||
| 
 | ||||
| 	@OneToMany(() => Message, (message: Message) => message.channel, { | ||||
| 		cascade: true, | ||||
| 		orphanedRowAction: "delete", | ||||
| @ -140,7 +143,7 @@ export class Channel extends BaseClass { | ||||
| 		orphanedRowAction: "delete", | ||||
| 	}) | ||||
| 	webhooks?: Webhook[]; | ||||
| 
 | ||||
| 	 | ||||
| 	// TODO: DM channel
 | ||||
| 	static async createChannel( | ||||
| 		channel: Partial<Channel>, | ||||
| @ -182,6 +185,7 @@ export class Channel extends BaseClass { | ||||
| 
 | ||||
| 		switch (channel.type) { | ||||
| 			case ChannelType.GUILD_TEXT: | ||||
| 			case ChannelType.GUILD_NEWS: | ||||
| 			case ChannelType.GUILD_VOICE: | ||||
| 				if (channel.parent_id && !opts?.skipExistsCheck) { | ||||
| 					const exists = await Channel.findOneOrFail({ id: channel.parent_id }); | ||||
| @ -191,25 +195,24 @@ export class Channel extends BaseClass { | ||||
| 				} | ||||
| 				break; | ||||
| 			case ChannelType.GUILD_CATEGORY: | ||||
| 			case ChannelType.UNHANDLED: | ||||
| 				break; | ||||
| 			case ChannelType.DM: | ||||
| 			case ChannelType.GROUP_DM: | ||||
| 				throw new HTTPError("You can't create a dm channel in a guild"); | ||||
| 			// TODO: check if guild is community server
 | ||||
| 			case ChannelType.GUILD_STORE: | ||||
| 			case ChannelType.GUILD_NEWS: | ||||
| 			default: | ||||
| 				throw new HTTPError("Not yet supported"); | ||||
| 		} | ||||
| 
 | ||||
| 		if (!channel.permission_overwrites) channel.permission_overwrites = []; | ||||
| 		// TODO: auto generate position
 | ||||
| 		// TODO: eagerly auto generate position of all guild channels
 | ||||
| 
 | ||||
| 		channel = { | ||||
| 			...channel, | ||||
| 			...(!opts?.keepId && { id: Snowflake.generate() }), | ||||
| 			created_at: new Date(), | ||||
| 			position: channel.position || 0, | ||||
| 			position: (channel.type === ChannelType.UNHANDLED ? 0 : channel.position) || 0, | ||||
| 		}; | ||||
| 
 | ||||
| 		await Promise.all([ | ||||
| @ -231,11 +234,13 @@ export class Channel extends BaseClass { | ||||
| 		const otherRecipientsUsers = await User.find({ where: recipients.map((x) => ({ id: x })) }); | ||||
| 
 | ||||
| 		// TODO: check config for max number of recipients
 | ||||
| 		/** if you want to disallow note to self channels, uncomment the conditional below | ||||
| 		if (otherRecipientsUsers.length !== recipients.length) { | ||||
| 			throw new HTTPError("Recipient/s not found"); | ||||
| 		} | ||||
| 		**/ | ||||
| 
 | ||||
| 		const type = recipients.length === 1 ? ChannelType.DM : ChannelType.GROUP_DM; | ||||
| 		const type = recipients.length > 1 ? ChannelType.DM : ChannelType.GROUP_DM; | ||||
| 
 | ||||
| 		let channel = null; | ||||
| 
 | ||||
| @ -288,7 +293,8 @@ export class Channel extends BaseClass { | ||||
| 			await emitEvent({ event: "CHANNEL_CREATE", data: channel_dto, user_id: creator_user_id }); | ||||
| 		} | ||||
| 
 | ||||
| 		return channel_dto.excludedRecipients([creator_user_id]); | ||||
| 		if (recipients.length === 1) return channel_dto;  | ||||
| 		else return channel_dto.excludedRecipients([creator_user_id]); | ||||
| 	} | ||||
| 
 | ||||
| 	static async removeRecipientFromChannel(channel: Channel, user_id: string) { | ||||
| @ -354,4 +360,5 @@ export interface ChannelPermissionOverwrite { | ||||
| export enum ChannelPermissionOverwriteType { | ||||
| 	role = 0, | ||||
| 	member = 1, | ||||
| 	group = 2, | ||||
| } | ||||
|  | ||||
| @ -2,7 +2,7 @@ import { Column, Entity, JoinColumn, ManyToOne, RelationId } from "typeorm"; | ||||
| import { BaseClass } from "./BaseClass"; | ||||
| import { User } from "./User"; | ||||
| 
 | ||||
| export interface PublicConnectedAccount extends Pick<ConnectedAccount, "name" | "type" | "verifie"> {} | ||||
| export interface PublicConnectedAccount extends Pick<ConnectedAccount, "name" | "type" | "verified"> {} | ||||
| 
 | ||||
| @Entity("connected_accounts") | ||||
| export class ConnectedAccount extends BaseClass { | ||||
| @ -35,7 +35,7 @@ export class ConnectedAccount extends BaseClass { | ||||
| 	type: string; | ||||
| 
 | ||||
| 	@Column() | ||||
| 	verifie: boolean; | ||||
| 	verified: boolean; | ||||
| 
 | ||||
| 	@Column({ select: false }) | ||||
| 	visibility: number; | ||||
|  | ||||
| @ -85,8 +85,8 @@ export class Member extends BaseClassWithoutId { | ||||
| 	@Column() | ||||
| 	joined_at: Date; | ||||
| 
 | ||||
| 	@Column({ type: "bigint", nullable: true }) | ||||
| 	premium_since?: number; | ||||
| 	@Column() | ||||
| 	premium_since?: Date; | ||||
| 
 | ||||
| 	@Column() | ||||
| 	deaf: boolean; | ||||
| @ -245,7 +245,7 @@ export class Member extends BaseClassWithoutId { | ||||
| 			nick: undefined, | ||||
| 			roles: [guild_id], // @everyone role
 | ||||
| 			joined_at: new Date(), | ||||
| 			premium_since: (new Date()).getTime(), | ||||
| 			premium_since: new Date(), | ||||
| 			deaf: false, | ||||
| 			mute: false, | ||||
| 			pending: false, | ||||
|  | ||||
| @ -12,11 +12,13 @@ export interface Interaction { | ||||
| } | ||||
| 
 | ||||
| export enum InteractionType { | ||||
| 	SelfCommand = 0, | ||||
| 	Ping = 1, | ||||
| 	ApplicationCommand = 2, | ||||
| } | ||||
| 
 | ||||
| export enum InteractionResponseType { | ||||
| 	SelfCommandResponse = 0, | ||||
| 	Pong = 1, | ||||
| 	Acknowledge = 2, | ||||
| 	ChannelMessage = 3, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Madeline
						Madeline