diff --git a/client/app/(bots)/bots/components/Hero/SearchResults/Card/index.jsx b/client/app/(bots)/bots/components/Hero/SearchResults/Card/index.jsx index 31bc40dc..5d46f7f3 100644 --- a/client/app/(bots)/bots/components/Hero/SearchResults/Card/index.jsx +++ b/client/app/(bots)/bots/components/Hero/SearchResults/Card/index.jsx @@ -15,6 +15,8 @@ import config from '@/config'; import useLanguageStore, { t } from '@/stores/language'; import UserBanner from '@/app/components/ImageFromHash/UserBanner'; import UserAvatar from '@/app/components/ImageFromHash/UserAvatar'; +import Tooltip from '@/app/components/Tooltip'; +import { ImTrophy } from 'react-icons/im'; export default function Card({ data, overridedSort }) { const isMobile = useMedia('(max-width: 420px)', false); @@ -152,15 +154,28 @@ export default function Card({ data, overridedSort }) { {t(`categories.${category === 'All' ? data.categories[0] : category}`)} - {data.vote_triple_enabled?.created_at && ( -
-
+ {data.is_most_voted ? ( + +
+
-
- {t('botCard.tripledVoteBadge')} +
+ {t('botCard.mostVotedBadge.label')} +
-
- )} +
+ ) : ( + data.vote_triple_enabled?.created_at && ( +
+
+ +
+ {t('botCard.tripledVoteBadge')} +
+
+ ))}
diff --git a/client/app/(servers)/servers/components/Hero/index.jsx b/client/app/(servers)/servers/components/Hero/index.jsx index fe58230c..922cc3f4 100644 --- a/client/app/(servers)/servers/components/Hero/index.jsx +++ b/client/app/(servers)/servers/components/Hero/index.jsx @@ -201,7 +201,7 @@ export default function Hero() { ) : ( <> diff --git a/client/app/(servers)/servers/components/ServerCard/index.jsx b/client/app/(servers)/servers/components/ServerCard/index.jsx index 3b832076..d2e31158 100644 --- a/client/app/(servers)/servers/components/ServerCard/index.jsx +++ b/client/app/(servers)/servers/components/ServerCard/index.jsx @@ -8,6 +8,7 @@ import { MdUpdate } from 'react-icons/md'; import { HiSortAscending, HiSortDescending } from 'react-icons/hi'; import { TiStar } from 'react-icons/ti'; import { IoHeart } from 'react-icons/io5'; +import { ImTrophy } from 'react-icons/im'; import { useMedia } from 'react-use'; import cn from '@/lib/cn'; import getRelativeTime from '@/lib/getRelativeTime'; @@ -17,6 +18,7 @@ import { GiInfinity } from 'react-icons/gi'; import useLanguageStore, { t } from '@/stores/language'; import ServerBanner from '@/app/components/ImageFromHash/ServerBanner'; import ServerIcon from '@/app/components/ImageFromHash/ServerIcon'; +import Tooltip from '@/app/components/Tooltip'; export default function ServerCard(props) { const isMobile = useMedia('(max-width: 420px)', false); @@ -165,8 +167,19 @@ export default function ServerCard(props) { {config.serverCategoriesIcons[props.server.category]} {t(`categories.${props.server.category}`)} + {props.server.is_most_voted ? ( + +
+
- {props.server.vote_triple_enabled?.created_at && ( +
+ {t('serverCard.mostVotedBadge.label')} +
+
+
+ ) : props.server.vote_triple_enabled?.created_at && (
diff --git a/client/locales/az.json b/client/locales/az.json index c4a72bfe..863cae79 100644 --- a/client/locales/az.json +++ b/client/locales/az.json @@ -676,7 +676,11 @@ }, "serverCard": { "noDescription": "Bu serverin təsviri yoxdur. ", - "tripledVoteBadge": "3X SƏS!" + "tripledVoteBadge": "3X SƏS!", + "mostVotedBadge": { + "tooltip": "Bu server keçən ay ən çox səs alan server idi.", + "label": "Ən çox səs alan" + } }, "serverPage": { "countdown": { @@ -1361,7 +1365,11 @@ "botCard": { "noDescription": "Bu botun təsviri yoxdur. ", "tripledVoteBadge": "3X SƏS!", - "neverVoted": "Heç bir səs yoxdur" + "neverVoted": "Heç bir səs yoxdur", + "mostVotedBadge": { + "tooltip": "Bu bot keçən ay ən çox səs alan bot idi.", + "label": "Ən çox səs alan" + } }, "badges": { "admin": "Admin", diff --git a/client/locales/en.json b/client/locales/en.json index b25da782..1944141e 100644 --- a/client/locales/en.json +++ b/client/locales/en.json @@ -676,7 +676,11 @@ }, "serverCard": { "noDescription": "This server does not have a description. We can only imagine how beautiful it is inside.", - "tripledVoteBadge": "3X VOTE!" + "tripledVoteBadge": "3X VOTE!", + "mostVotedBadge": { + "tooltip": "This server was the most voted server last month.", + "label": "Most Voted" + } }, "serverPage": { "countdown": { @@ -1361,7 +1365,11 @@ "botCard": { "noDescription": "This bot does not have a description. We can only imagine how beautiful it is.", "tripledVoteBadge": "3X VOTE!", - "neverVoted": "Never Voted" + "neverVoted": "Never Voted", + "mostVotedBadge": { + "tooltip": "This bot was the most voted bot last month.", + "label": "Most Voted" + } }, "badges": { "admin": "Admin", diff --git a/client/locales/tr.json b/client/locales/tr.json index 3ab4d2cf..84a2ef05 100644 --- a/client/locales/tr.json +++ b/client/locales/tr.json @@ -676,7 +676,11 @@ }, "serverCard": { "noDescription": "Bu sunucunun açıklaması yok. İçeride ne kadar güzel olduğunu ancak hayal edebiliyoruz.", - "tripledVoteBadge": "3X OY!" + "tripledVoteBadge": "3X OY!", + "mostVotedBadge": { + "tooltip": "Bu sunucu geçen ay en çok oy alan sunucuydu.", + "label": "En Çok Oy Alan" + } }, "serverPage": { "countdown": { @@ -1361,7 +1365,11 @@ "botCard": { "noDescription": "Bu botun bir açıklaması yok. Sadece ne kadar güzel olduğunu hayal edebiliriz.", "tripledVoteBadge": "3X OY!", - "neverVoted": "Hiç oy verilmedi" + "neverVoted": "Hiç oy verilmedi", + "mostVotedBadge": { + "tooltip": "Bu bot geçen ay en çok oy alan botdu.", + "label": "En Çok Oy Alan" + } }, "badges": { "admin": "Yönetici", diff --git a/server/src/routes/bots/search.js b/server/src/routes/bots/search.js index 204a0205..888b2482 100644 --- a/server/src/routes/bots/search.js +++ b/server/src/routes/bots/search.js @@ -5,6 +5,7 @@ const Bot = require('@/schemas/Bot'); const Review = require('@/schemas/Bot/Review'); const { StandedOutBot } = require('@/schemas/StandedOut'); const validateRequest = require('@/utils/middlewares/validateRequest'); +const { BotMonthlyVotes } = require('@/schemas/MonthlyVotes'); module.exports = { get: [ @@ -72,6 +73,14 @@ module.exports = { const total = await Bot.countDocuments(findQuery); const maxReached = skip + foundBots.length >= total; + const monthlyVotes = await BotMonthlyVotes.find({ identifier: { $in: sortedBots.map(server => server.id) } }); + + const mostVotedBot = monthlyVotes.find(({ data }) => { + const latestData = data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0]; + + return latestData.is_most_voted === true; + }); + return response.json({ maxReached, total, @@ -83,7 +92,8 @@ module.exports = { return { ...publiclySafeBot, reviews: reviews.filter(review => review.bot.id === bot.id).length, - latest_voted_at: bot.last_voter?.date || null + latest_voted_at: bot.last_voter?.date || null, + is_most_voted: mostVotedBot?.identifier === bot.id }; })) }); diff --git a/server/src/routes/servers/search.js b/server/src/routes/servers/search.js index 4e4e54ef..ea09ff68 100644 --- a/server/src/routes/servers/search.js +++ b/server/src/routes/servers/search.js @@ -5,6 +5,7 @@ const User = require('@/schemas/User'); const ServerVoteTripleEnabled = require('@/schemas/Server/Vote/TripleEnabled'); const { StandedOutServer } = require('@/schemas/StandedOut'); const validateRequest = require('@/utils/middlewares/validateRequest'); +const { ServerMonthlyVotes } = require('@/schemas/MonthlyVotes'); module.exports = { get: [ @@ -83,6 +84,13 @@ module.exports = { }).select('id'); const voteTripleEnabledServerIds = await ServerVoteTripleEnabled.find({ id: { $in: sortedServers.map(server => server.id) } }); + const monthlyVotes = await ServerMonthlyVotes.find({ identifier: { $in: sortedServers.map(server => server.id) } }); + + const mostVotedServer = monthlyVotes.find(({ data }) => { + const latestData = data.sort((a, b) => new Date(b.created_at) - new Date(a.created_at))[0]; + + return latestData.is_most_voted === true; + }); return response.json({ maxReached, @@ -120,6 +128,7 @@ module.exports = { standed_out: standedOutServerIds.find(({ identifier }) => identifier === guild.id) ? { created_at: standedOutServerIds.find(({ identifier }) => identifier === guild.id).createdAt } : null, + is_most_voted: mostVotedServer?.identifier === guild.id, owner: { id: guild.ownerId }