diff --git a/.gitignore b/.gitignore
index a3b38a88..a24f2cdd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -42,6 +42,7 @@ board/*.json
 tag/*.json
 welcome/*.json
 bye/*.json
+webhook/*.json
 json/censor.json
 json/uncensor.json
 
diff --git a/commands/fun/fakebot.js b/commands/fun/fakebot.js
new file mode 100644
index 00000000..325516e3
--- /dev/null
+++ b/commands/fun/fakebot.js
@@ -0,0 +1,62 @@
+const { Command } = require('discord-akairo');
+const fs = require('fs');
+const reload = require('auto-reload');
+
+class fakebotCommand extends Command {
+	constructor() {
+		super('fakebot', {
+			aliases: ['fakebot', 'fakeuser', 'fakemember'],
+			category: 'fun',
+			clientPermissions: ['MANAGE_WEBHOOKS'],
+			args: [
+				{
+					id: 'member',
+					type: 'user',
+					prompt: {
+						start: 'Who should i fake?',
+					}
+				},
+				{
+					id: 'message',
+					type: 'string',
+					prompt: {
+						start: 'What message should i send?',
+					},
+					match: 'rest',
+				}
+			],
+			description: {
+				content: 'Fake a bot/user with webhook',
+				usage: '',
+				examples: ['']
+			}
+		});
+	}
+
+	async exec(message, args) {
+		if (!fs.existsSync(`./webhook/${message.guild.id}_${message.channel.id}.json`)) {
+			message.channel.createWebhook('fakebot')
+				.then(webhook => {
+					fs.writeFile(`./webhook/${message.guild.id}_${message.channel.id}.json`, `{"id": "${webhook.id}", "token": "${webhook.token}", "channel": "${message.channel.id}"}`, function (err) {
+						if (err) {
+							console.log(err);
+						}
+						return message.channel.send('Please run me again to send the message!');
+					});
+				});
+		} else {
+			let webhook = reload(`../../webhook/${message.guild.id}_${message.channel.id}.json`);
+			this.client.fetchWebhook(webhook.id, webhook.token)
+				.then(webhook => {
+					webhook.edit({
+						name: args.member.username,
+						avatar: args.member.displayAvatarURL()
+					});
+
+					message.delete();
+					return webhook.send(args.message);
+				});
+		}
+	}
+}
+module.exports = fakebotCommand;
\ No newline at end of file
diff --git a/commands/fun/fakejoin.js b/commands/fun/fakejoin.js
new file mode 100644
index 00000000..f2b0367c
--- /dev/null
+++ b/commands/fun/fakejoin.js
@@ -0,0 +1,70 @@
+const { Command } = require('discord-akairo');
+const fs = require('fs');
+const rand = require('../../rand.js');
+
+class fakejoinCommand extends Command {
+	constructor() {
+		super('fakejoin', {
+			aliases: ['fakejoin'],
+			category: 'admin',
+			channelRestriction: 'guild',
+			args: [
+				{
+					id: 'member',
+					type: 'string',
+					match: 'rest'
+				}
+			],
+			description: {
+				content: 'Fake join message',
+				usage: '[text]',
+				examples: ['Supositware']
+			}
+		});
+	}
+
+	async exec(message, args) {
+		if (fs.existsSync(`./welcome/${message.guild.id}.json`)) {
+			let member;
+			if (args.member) {
+				member = args.member;
+			} else {
+				member = message.author.username;
+			}
+
+			let welcome = require(`../../welcome/${message.guild.id}.json`);
+
+			const channel = this.client.channels.get(welcome['channel']);
+
+			let byeMessage = welcome['message'];
+
+			byeMessage = byeMessage.replace(/\[member\]/, member);
+			byeMessage = byeMessage.replace(/\[server\]/, message.guild.name);
+
+			let attach;
+			if (byeMessage.includes('[attach:')) {
+				attach = byeMessage.split(/(\[attach:.*?])/);
+				for (let i = 0, l = attach.length; i < l; i++) {
+					if (attach[i].includes('[attach:')) {
+						attach = attach[i].replace('[attach:', '').slice(0, -1);
+						i = attach.length;
+					}
+				}
+				byeMessage = byeMessage.replace(/(\[attach:.*?])/, '');
+			}
+
+			byeMessage = rand.random(byeMessage);	
+
+			message.delete();
+			if (attach) {
+				return channel.send(byeMessage, {files: [attach]});
+			} else {
+				return channel.send(byeMessage);
+			}
+		} else {
+			return message.channel.send('The server need a join message first!');
+		}
+	}
+}
+
+module.exports = fakejoinCommand;
\ No newline at end of file
diff --git a/event/listeners/messageReactionAdd.js b/event/listeners/messageReactionAdd.js
index 5ce3d6d5..1725f330 100644
--- a/event/listeners/messageReactionAdd.js
+++ b/event/listeners/messageReactionAdd.js
@@ -59,17 +59,27 @@ class MessageReactionAddListener extends Listener {
 				channel = client.channels.get(shameboardChannel['shameboard']);
 			}
 
-			const Embed = new MessageEmbed()
+			let Embed = new MessageEmbed()
 				.setColor(reaction.message.member.displayHexColor)
 				.setAuthor(reaction.message.author.username, reaction.message.author.displayAvatarURL())
-				.setDescription(messageContent)
 				.addField('Jump to', `[message](https://discordapp.com/channels/${reaction.message.guild.id}/${reaction.message.channel.id}/${reaction.message.id})`, true)
 				.addField('Channel', reaction.message.channel, true)
 				.setFooter(reaction.count + ' ' + emote)
 				.setTimestamp();
 
-			return channel.send({files: messageAttachments, embed: Embed})
-				.catch(() => channel.send(messageAttachments, { embed: Embed}));
+			if (reaction.message.channel.nsfw) {
+				Embed.setDescription(`||${messageContent}||`);
+				if (messageAttachments != '') {
+					return channel.send(`||${messageAttachments}||`, {embed: Embed});
+				}
+				else {
+					return channel.send({embed: Embed});
+				}
+			} else {
+				Embed.setDescription(messageContent);
+				return channel.send({files: messageAttachments, embed: Embed})
+					.catch(() => channel.send(messageAttachments, { embed: Embed}));
+			}
 		}
 	}
 }
diff --git a/webhook/yes b/webhook/yes
new file mode 100644
index 00000000..e69de29b