I need to fix my discord comand "Whois". Can someone help me fix my code? Message me on twt: KiseeIsHere (not really necessary I just need to expand my message because stackflow wants me to).
module.exports.run = async (client, message, args) => {
const { MessageEmbed } = require('discord.js');
let member = message.mentions.users.first() || message.guild.members.cache.get(args[0]) || message.author || message.member;
let avatar = member.displayAvatarURL({ size: 1024, dynamic: true });
const statuses = {
online: "Online",
dnd: "Dnd",
idle: "Idle",
offline: "Offline"
};
let itstatus = statuses;
const exampleEmbed = new MessageEmbed()
.setTitle(member.username + "'s Profile")
.setColor('#2f3136')
.setThumbnail(avatar)
.addField("User Tag", member.tag, true)
.addField("ID", `${member.id}`, true)
.addField("Status", itstatus[member.presence.status], true)
.addField(
`Roles Count`,
message.guild.members.cache.get(member.user.id).roles.cache.size ||
"No Roles!",
true
)
.addField(`Avatar Url`, `[Link](${avatar})`, true)
.setFooter(`Requested by ${message.author.username}`)
.setTimestamp();
message.channel.send({ embeds: [exampleEmbed] });
}
module.exports.config = {
name: "whois",
aliases: ['ui']
}
Made a couple of changes, mostly to grab user stuff in the event someone runs it to get info on a bot and cleaned up the code a bit. I have tested and works as expected
const {
MessageEmbed,
} = require('discord.js');
module.exports.run = async (client, message, args) => {
const member = message.mentions.members.first() || message.guild.members.cache.get(args[0]) || message.member;
const statuses = {
online: "Online",
dnd: "Dnd",
idle: "Idle",
offline: "Offline",
};
let status;
if (!member.presence) {
status = 'Unknown;'
} else {
status = statuses[member.presence.status]
}
const exampleEmbed = new MessageEmbed()
.setTitle(`${member.user.username}'s Profile`)
.setColor('#2f3136')
.setThumbnail(member.user.avatarURL({
size: 1024,
dynamic: true,
}))
.addFields({
name: "User Tag",
value: `${member.user.tag}`,
inline: true,
}, {
name: "ID",
value: `${member.id}`,
inline: true,
}, {
name: "Status",
value: `${status}`,
inline: true,
}, {
name: `Roles Count`,
value: `${message.guild.members.cache.get(member.user.id).roles.cache.size}` || "No Roles!",
inline: true,
}, {
name: `Avatar Url`,
value: `[Link](${member.user.avatarURL()})`,
inline: true,
})
.setFooter({
text: `Requested by ${message.author.username}`,
})
.setTimestamp();
message.channel.send({
embeds: [exampleEmbed],
});
};
module.exports.config = {
name: "whois",
aliases: ['ui'],
};
Related
I am trying to get single products data from mongodb in reactjs but when I am mapping that data its not mapping and giving this error:
this is my backend way of getting single prod:
const getProdsById = asyncHandler(async (req, res) => {
const prod = await Prod.findById(req.params.id);
if (prod) {
res.json(prod);
} else {
res.status(404);
throw new Error("Product not found");
}
});
this is the routes page:
const {
getProds,
getProdsById,
postProds,
updateProds,
delProds,
} = require("../controllers/ProdControllers");
router.route("/").get(getProds).post(postProds);
router.route("/:id").delete(delProds).put(updateProds).get(getProdsById);
i tested this by using postman and it worked there easily but in the react part its not working and giving error!
[![enter image description here][2]][2]
product collection model:
const mongoose = require("mongoose");
const prodScheme = mongoose.Schema(
{
pname: {
type: String,
required: true,
},
longname: {
type: String,
required: true,
},
shortname: {
type: String,
required: true,
},
specs: {
type: Array,
required: true,
},
price: {
type: Number,
required: true,
},
discount: {
type: Number,
required: true,
},
netprice: {
type: Number,
required: true,
},
ratings: {
type: Number,
required: true,
},
category: {
type: Object,
required: true,
},
brand: {
type: Object,
required: true,
},
banner: {
type: String,
required: true,
},
},
{
timestamps: true,
}
);
module.exports = mongoose.model("Prod", prodScheme);
my react frontend:
let [searchParams, setSearchParams] = useSearchParams();
const [Prods, setProds] = useState([]);
const getData = async () => {
try {
const presponse = await fetch(`/api/prods/${searchParams.get("id")}`);
const pjson = await presponse.json();
if (presponse.ok) {
setProds(pjson);
}
} catch (err) {
// console.error(err);
// alert(err.message);
}
};
useEffect(() => {
getData();
}, [Prods]);
{Prods.map((prod) => (
<h2>{prod.pname}</h2>
))}
btw searchParams is working fine i can see the exact id in url box aswell and also i printed it in console then also tested it with postman and it works fine
I have problem with getting data from DB. I want to get "collections" Array from mongoDB and render it in table component, but query returns null because of problem "user not found". Interesting thing is that if I use {email: req.body.email} in updateOne query to search for user and then create new collection it works and user is found.
getCollections.js
const router = require("express").Router();
const User = require("../models/user");
router.get("/", (req, res) => {
var query = { email: req.body.email };
User.find(query, (err, result) => {
if (err) {
res.json({ status: "error", error: "User not found" }, err);
} else {
res.json(result);
}
});
});
module.exports = router;
frontend getCollections query
useEffect(() => {
const url = "http://localhost:5000/api/getCollections";
// const url = `https://item-collection-app-bz.herokuapp.com/api/getCollections`;
axios
.get(url, { email: localStorage.getItem("email") })
.then((response) => {
setListOfCollections(response.data);
});
});
user.js UserSchema
const jwt = require("jsonwebtoken");
const mongoose = require("mongoose");
const userSchema = new mongoose.Schema({
_id: { type: mongoose.Schema.Types.ObjectId, required: true },
username: { type: String, require: true },
password: { type: String, require: true },
email: { type: String, require: true },
admin: { type: Boolean },
blocked: { type: Boolean },
collections: [
{
_id: { type: mongoose.Schema.Types.ObjectId, required: true },
coll_name: { type: String },
type: { type: String },
coll_desc: { type: String },
coll_image: { type: String },
items: [
{
_id: { type: mongoose.Schema.Types.ObjectId, required: true },
item_name: { type: String },
item_desc: { type: String },
comments: [
{
user: { type: String },
comment: { type: String },
comment_id: { type: String },
},
],
likes: { type: Number },
item_image: { type: String },
upload_date: { type: String },
},
],
},
],
});
userSchema.methods.generateAuthToken = function () {
const appToken = jwt.sign({ _id: this._id }, process.env.JWTPRIVATEKEY, {
expiresIn: "7d",
});
return appToken;
};
const User = mongoose.model("user", userSchema);
module.exports = User;
mongoDB
mongoDB structure
Tried User.findOne(), User.find()
SOLUTION
Thank you #Varun Kaklia. The solution is changing router.get and axios.get to router.post and axios.post.
Hey #1zboro1 first check did you receive any data from frontend inside Routes like-
const router = require("express").Router();
const User = require("../models/user");
router.get("/", (req, res) => {
const email = req.body.email;
console.log("Email from frontend", email)
var query = { email: req.body.email };
if (email != null || undefined) {
try {
const user = await User.find({ email});
console.log("User Details in User Routes of Backend",user)
if (user.length > 0) {
const currentUser = {
name: user[0].name,
email1: user[0].email1,
isAdmin: user[0].isAdmin,
_id: user[0]._id,
};
// console.log("Get User in User Routes of Backend", currentUser)
res.status(200).send(currentUser);
}
} catch (error) {
res.status(404).json({
message: "Something Went wrong",
});
}
Hope this code solve your query and give you desired result. If you still facing issue lemme know.
Thanks
I am trying to log when a permissions from a channel got updated. This is what i have now: but i don't come further at this point. Hope some one could help me here.
const { MessageEmbed, GuildChannel } = require("discord.js");
const DB = require('../../Structures/Schemas/loggingDB');
module.exports = {
name: "channelUpdate",
/**
*
* #param {GuildChannel} oldChannel
* #param {GuildChannel} newChannel
*/
async execute(oldChannel, newChannel) {
const { guild } = oldChannel;
const data = await DB.findOne({ GuildID: guild.id });
if (!data) {
return
}
const LogChannel = await guild.channels.fetch(data.ChannelID)
if (!LogChannel.guild) return false;
const AuditLogFetch = await oldChannel.guild.fetchAuditLogs({ limit: 1, type: "CHANNEL_UPDATE" });
if (!LogChannel) return console.error(`Invalid channel.`);
if (!AuditLogFetch.entries.first()) return console.error(`No entries found.`);
const Entry = AuditLogFetch.entries.first();
//console.log(Entry)
//console.log(oldChannel)
//console.log(newChannel)
//console.log(oldChannel)
const embed = new MessageEmbed()
.setColor("#b827ba")
.setTitle("Channel Updated")
.setDescription("An channel has been updated!")
.addFields(
{ name: "Updated By:", value: `${Entry.executor.tag || "Someone"}` },
{ name: "Channel Name:", value: `${oldChannel.name}` },
{ name: "Action:", value: `${Entry.action}` },
{ name: "Created At:", value: `<t:${parseInt(oldChannel.createdTimestamp / 1000)}:f>` },
)
.setTimestamp()
if (oldChannel.name != newChannel.name) {
embed.addFields(
{ name: "Old Channel Name:", value: `${oldChannel.name}` },
{ name: "New Channel Name:", value: `${newChannel.name}` },
)
}
console.log("Oldchannel:", oldChannel.permissionOverwrites.cache)
console.log("newchannel:", newChannel.permissionOverwrites.cache)
LogChannel.send({ embeds: [embed] })
}
}
This is the output that i get from console.log("newchannel:", newChannel.permissionOverwrites.cache.
From this point i don't know how i get the names etc.
Oldchannel: Collection(2) [Map] {
'973305365540266055' => PermissionOverwrites {
id: '973305365540266055',
type: 'role',
deny: Permissions { bitfield: 0n },
allow: Permissions { bitfield: 1024n }
},
'976422603227013130' => PermissionOverwrites {
id: '976422603227013130',
type: 'role',
deny: Permissions { bitfield: 1024n },
allow: Permissions { bitfield: 0n }
}
}
newchannel: Collection(2) [Map] {
'973305365540266055' => PermissionOverwrites {
id: '973305365540266055',
type: 'role',
deny: Permissions { bitfield: 0n },
allow: Permissions { bitfield: 0n }
},
'976422603227013130' => PermissionOverwrites {
id: '976422603227013130',
type: 'role',
deny: Permissions { bitfield: 1024n },
allow: Permissions { bitfield: 0n }
}
}
fixed by using code as below -
const { MessageEmbed, GuildChannel } = require("discord.js");
const DB = require('../../Structures/Schemas/loggingDB');
const { ColorYom } = require("../../Structures/botConfig.json")
module.exports = {
name: "channelUpdate",
/**
*
* #param {GuildChannel} oldChannel
* #param {GuildChannel} newChannel
*/
async execute(oldChannel, newChannel) {
const { guild } = oldChannel;
const data = await DB.findOne({ GuildID: guild.id });
if (!data) {
return
}
const LogChannel = await guild.channels.fetch(data.ChannelID)
if (!LogChannel.guild) return false;
const AuditLogFetch = await oldChannel.guild.fetchAuditLogs({ limit: 1, type: "CHANNEL_UPDATE" });
if (!LogChannel) return console.error(`Invalid channel.`);
if (!AuditLogFetch.entries.first()) return console.error(`No entries found.`);
const Entry = AuditLogFetch.entries.first();
const embed = new MessageEmbed()
.setColor(`${ColorYom}`)
.setTitle("Channel Updated")
.setDescription("An channel has been updated!")
.addFields(
{ name: "Updated By:", value: `${Entry.executor.tag || "Someone"}` },
{ name: "Channel Name:", value: `${oldChannel.name}` },
{ name: "Action:", value: `${Entry.action}` },
)
.setTimestamp()
if (oldChannel.name != newChannel.name) {
embed.addFields(
{ name: "Old Channel Name:", value: `${oldChannel.name}` },
{ name: "New Channel Name:", value: `${newChannel.name}` },
)
}
LogChannel.send({ embeds: [embed] })
}
}
Hello I'm working on a social network project using MERN Stack and in there user can either make a post with only text or can make a post by uploading an image along with some text as a caption, but the problem is that when a user doesn't wish to upload image and just want to post only with text and leaves postImage field empty then this error occurs Cannot read property 'path' of undefined what can be the solution for this, I'm attaching the post schema, post routes and post state:
Post Schema:
const mongoose = require('mongoose');
const postSchema = mongoose.Schema({
user: {
type: mongoose.Schema.ObjectId,
ref: 'Users',
},
text: {
type: String,
required: [true, 'post cannot be empty'],
},
postImage: {
type: String,
},
name: {
type: String,
},
avatar: {
type: String,
},
likes: [
{
user: {
type: mongoose.Schema.ObjectId,
ref: 'User',
},
},
],
comments: [
{
user: {
type: mongoose.Schema.ObjectId,
ref: 'User',
},
comment: {
type: String,
required: true,
},
name: {
type: String,
},
avatar: {
type: String,
},
date: {
type: Date,
default: Date.now,
},
},
],
date: {
type: Date,
default: Date.now,
},
});
module.exports = mongoose.model('Post', postSchema);
Post Route:
const express = require('express');
const router = express.Router();
const auth = require('../middleware/auth');
const Post = require('../models/postModel');
const multer = require('multer');
const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads');
},
filename: function (req, file, cb) {
cb(null, file.originalname);
},
});
const fileFilter = (req, file, cb) => {
if (
file.mimetype === 'image/jpeg' ||
file.mimetype === 'image/png' ||
file.mimetype === 'image/gif'
) {
cb(null, true);
} else {
cb(new Error('The supported file types are jpeg, png and gif'), false);
}
};
const upload = multer({
storage: storage,
limits: {
fileSize: 1024 * 1024 * 5,
},
fileFilter: fileFilter,
});
const { check, validationResult } = require('express-validator');
const User = require('../models/userModel');
router.post(
'/',
upload.single('postImage'),
[auth, check('text', 'Text is required').not().isEmpty()],
async (req, res) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.status(400).json({ errors: errors.array() });
}
try {
const user = await User.findById(req.user.id).select('-password');
const newPost = new Post({
text: req.body.text,
postImage: req.file.path,
name: user.name,
avatar: user.avatar,
user: req.user.id,
});
const post = await newPost.save();
res.json(post);
} catch (err) {
console.error(err.message);
res.status(500).send('Server Error');
}
}
);
Post State:
const createPost = async postData => {
try {
const config = {
headers: {
'Content-Type': 'multipart/form-data',
},
};
const res = await axios.post('/api/posts', postData, config);
dispatch({
type: ADD_POST,
payload: res.data,
});
} catch (err) {
dispatch({
type: POST_ERROR,
payload: err.response.msg,
});
}
};
You can simply check if req.file is defined - if yes set postImage to its path, else set it to undefined:
const newPost = new Post({
text: req.body.text,
postImage: req.file ? req.file.path : undefined,
name: user.name,
avatar: user.avatar,
user: req.user.id,
});
I have searched high and low but haven't found a solution.
I am trying to save an array of subdocuments (that is dynamic).
Here's my schema:
const EventSchema = new Schema({
user: {
type: mongoose.Schema.Types.ObjectId,
ref: 'users'
},
title: {
type: String,
required: true
},
attendee:[
{
email: {
type: String,
required: true
},
name: {
type: String,
required: true
},
status: {
type: String
}
}]
});
Here's the route:
router.post('/', auth, async (req, res) => {
const {title, attendee: [{ email, name, status }] } = req.body
try{
const newEvent = new Event({
title,
user: req.user.id,
attendee: [{ email, name, status }]
});
const event = await newEvent.save();
if (!event) throw Error('Something went wrong saving the event');
res.status(200).json(event);
catch (e) {
res.status(400).json({ msg: e.message });
}
});
Currently I am only getting 1 element in the array to save.
The items in the array will always be different.
I don't have the option of creating the "event" first and then adding "attendees".
Example of input:
{
"title": "Something",
"attendee": [
{
"email": "email#gmail.com",
"name": "Bob"
},
{
"email": "sandwich#gmail.com",
"name": "Martha"
}
]
}
Output:
{
"_id": "5ef1521f06a67811f74ba905",
"title": "Something",
"user": "5ecdaf3601cd345ddb73748b",
"attendee": [
{
"_id": "5ef1521f06a67811f74ba906",
"email": "email#gmail.com",
"name": "Bob"
}
],
"__v": 0
}
Instead of destructuring for the one object of the array, you can get the whole array of attendee from the request body and save it as it is.
router.post('/', auth, async (req, res) => {
const eventObj = {
user: req.user.id,
title : req.body.title,
// get the whole array of attendee objects from the request
attendee: req.body.attendee
}
try{
const newEvent = new Event(eventObj);
const event = await newEvent.save();
if (!event) throw Error('Something went wrong saving the event');
res.status(200).json(event);
catch (e) {
res.status(400).json({ msg: e.message });
}
});
If I understand you correctly, you should not destructure attendee and insert into your new Event every attendee (choosing which key to insert in database).
const {
title,
attendee,
} = req.body;
const newEvent = new Event({
title,
user: req.user.id,
attendee: attendee.map(x => ({
email: x.email,
name: x.name,
status: x.status,
})),
});