├── CNAME ├── .gitignore ├── .env.example ├── middleware └── checkAuth.js ├── router ├── logout.js ├── support.js ├── premium.js ├── login.js ├── invite.js └── index.js ├── package.json ├── views ├── layout │ ├── footer.ejs │ ├── script.ejs │ ├── head.ejs │ └── navbar.ejs └── pages │ ├── premium.ejs │ └── index.ejs ├── README.md ├── index.js ├── public └── css │ ├── main.css │ └── premium.css └── Images └── undraw_Faq_re_31cw.svg /CNAME: -------------------------------------------------------------------------------- 1 | fnrdev.me 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | sessions -------------------------------------------------------------------------------- /.env.example: -------------------------------------------------------------------------------- 1 | clientID= 2 | token= 3 | callback=http://localhost:3000/login 4 | secret= 5 | port=3000 6 | SCOPES=identify,guilds 7 | SUPPORT=probot 8 | -------------------------------------------------------------------------------- /middleware/checkAuth.js: -------------------------------------------------------------------------------- 1 | function checkAuth(req, res, next) { 2 | if (req.isAuthenticated()) return next(); 3 | res.redirect('/login') 4 | } 5 | 6 | module.exports = checkAuth; -------------------------------------------------------------------------------- /router/logout.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.get('/', async (req, res) => { 5 | await req.logout(); 6 | res.redirect('/') 7 | }) 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /router/support.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.get('/', (req, res) => { 5 | res.redirect(`https://discord.gg/${process.env.SUPPORT}`) 6 | }) 7 | 8 | module.exports = router; -------------------------------------------------------------------------------- /router/premium.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const checkAuth = require('../middleware/checkAuth') 4 | 5 | router.get('/', checkAuth, async(req, res) => { 6 | res.render('pages/premium') 7 | }) 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /router/login.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | const passport = require('passport') 4 | 5 | router.get('/', passport.authenticate('discord', { 6 | failureRedirect: '/' 7 | }), (req, res) => { 8 | res.redirect('/') 9 | }) 10 | 11 | module.exports = router; -------------------------------------------------------------------------------- /router/invite.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.get('/', (req, res) => { 5 | let client = req.bot 6 | res.redirect(`https://discord.com/api/oauth2/authorize?client_id=${client.user.id}&permissions=8&scope=bot%20applications.commands`) 7 | }) 8 | 9 | module.exports = router; -------------------------------------------------------------------------------- /router/index.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const router = express.Router(); 3 | 4 | router.get('/', async (req, res) => { 5 | const client = req.bot; 6 | const fetchApplication = await client.application.fetch(); 7 | res.render('pages/index', { 8 | description: fetchApplication.description || `I can\'t find about me in ${client.user.username} bot` 9 | }) 10 | }) 11 | 12 | module.exports = router; -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "web", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "npm i; node ." 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "colors": "^1.4.0", 14 | "discord.js": "^13.2.0", 15 | "dotenv": "^10.0.0", 16 | "ejs": "^2.6.1", 17 | "express": "^4.17.1", 18 | "express-session": "^1.17.2", 19 | "passport": "^0.4.1", 20 | "passport-discord": "^0.1.4", 21 | "session-file-store": "^1.5.0" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /views/layout/footer.ejs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /views/layout/script.ejs: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Note: this project forked from [xCuzSkillz](https://github.com/xCuzSkillz) i just created server side 2 | 3 | 4 | ## Installation 5 | 6 | ```sh 7 | npm install 8 | ``` 9 | --- 10 | 11 | ### You need to rename .env file 12 | 13 | - .env 14 | ```sh 15 | clientID= 16 | token= 17 | callback=http://localhost:3000/login 18 | secret= 19 | port=3000 20 | SCOPES=identify,guilds 21 | SUPPORT=pornhub 22 | ``` 23 | --- 24 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /views/layout/head.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <% if (route.includes('premium')) { %> 9 | 10 | <% } %> 11 | <%= client.user.username %> 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /views/layout/navbar.ejs: -------------------------------------------------------------------------------- 1 |
2 | 43 |
-------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // import packages 2 | const express = require('express'); 3 | const app = express(); 4 | const Discord = require('discord.js'); 5 | const client = new Discord.Client({ intents: ["GUILDS"] }) 6 | app.set('view engine', 'ejs'); 7 | app.use(express.urlencoded({ extended: true })); 8 | const passport = require('passport'); 9 | const DiscordStrategy = require('passport-discord').Strategy; 10 | const session = require('express-session'); 11 | const fileStore = require('session-file-store')(session); 12 | app.use(express.json()); 13 | app.use(express.static('public')) 14 | require('dotenv').config(); 15 | require('colors'); 16 | 17 | // strategy for discord 18 | passport.use(new DiscordStrategy({ 19 | clientID: process.env.clientID, 20 | clientSecret: process.env.secret, 21 | callbackURL: process.env.callback, 22 | scope: process.env.SCOPES.split(',') 23 | }, function(accessToken, refreshToken, profile, done) { 24 | process.nextTick(function() { 25 | return done(null, profile) 26 | }) 27 | })) 28 | 29 | // setup session 30 | app.use(session({ 31 | secret: 'fnr12345624', 32 | resave: false, 33 | saveUninitialized: false, 34 | store: new fileStore({ 35 | logFn: () => true 36 | }), 37 | cookie: { maxAge: 3600000 * 24 * 30 } 38 | })); 39 | 40 | // serializeUser & deserializeUser 41 | app.use(passport.initialize()); 42 | app.use(passport.session()); 43 | passport.serializeUser(function(user, done) { 44 | done(null, user); 45 | }); 46 | passport.deserializeUser(function(obj, done) { 47 | done(null, obj); 48 | }); 49 | 50 | // locals 51 | app.use(async function(req, res, next) { 52 | let user; 53 | if (req.isAuthenticated()) { 54 | user = await client.users.fetch(req.user.id) 55 | } 56 | req.bot = client; 57 | res.locals.login = req.isAuthenticated(); 58 | res.locals.client = client; 59 | res.locals.user = user; 60 | res.locals.loggedUser = req.user; 61 | res.locals.route = req.originalUrl; 62 | next(); 63 | }) 64 | 65 | // routes 66 | app.use('/', require('./router/index')) 67 | app.use('/invite', require('./router/invite')) 68 | app.use('/premium', require('./router/premium')) 69 | app.use('/login', require('./router/login')) 70 | app.use('/logout', require('./router/logout')) 71 | app.use('/support', require('./router/support')) 72 | 73 | // end of routes 74 | 75 | // start backend server 76 | app.listen(process.env.port, () => console.log(`App is ready in port ${process.env.port}`)) 77 | 78 | client.on('ready', () => { 79 | console.log(`[Discord API] Logged in as ${client.user.username}`.cyan); 80 | }) 81 | 82 | client.login(process.env.token); -------------------------------------------------------------------------------- /public/css/main.css: -------------------------------------------------------------------------------- 1 | *{ 2 | margin: 0; 3 | padding: 0; 4 | box-sizing: border-box; 5 | } 6 | body{ 7 | background-color: #0a0a19; 8 | color: #f7f7f7; 9 | font-family: 'Cairo', sans-serif; 10 | } 11 | .nav-c{ 12 | position: relative; 13 | top: 1.1px; 14 | left: 12px; 15 | } 16 | .navbar-brand{ 17 | text-transform: uppercase; 18 | font-size: 1.5rem; 19 | } 20 | .dropdown-toggle{ 21 | background-color: #161625; 22 | } 23 | .dropdown-toggle:focus, .dropdown-toggle:active{ 24 | outline: none; 25 | border: none; 26 | box-shadow: none; 27 | } 28 | .dropdown-item{ 29 | background-color: #f04747; 30 | border-radius: 5px; 31 | width: 90%; 32 | margin-left: 5%; 33 | } 34 | .dr-tg{ 35 | background-color: transparent; 36 | border: none; 37 | } 38 | .dr-tg:focus, .dr-tg:hover, .dr-tg:active{ 39 | background-color: transparent; 40 | box-shadow: none; 41 | } 42 | .btn-custom1{ 43 | background-color: #5e5ac9; 44 | color: #f7f7f7; 45 | padding: 10px 18px; 46 | border: none; 47 | border-radius: 4px; 48 | display: inline-block; 49 | font-size: 16px; 50 | } 51 | .dropdown-menu{ 52 | background-color: #161625; 53 | } 54 | .btn-custom:hover{ 55 | color: #bbbbbb; 56 | } 57 | .dropdown-item:hover{ 58 | background-color: #1c1c2e; 59 | } 60 | .br-cs{ 61 | width: 10px; 62 | height: 30px; 63 | } 64 | .cont{ 65 | margin-top: 12%; 66 | } 67 | .col-cus{ 68 | color: #bbbbbb; 69 | } 70 | .par1{ 71 | font-weight: 700; 72 | font-size: 2em; 73 | } 74 | .btn-invite{ 75 | background-color: #5e5ac9; 76 | color: #f7f7f7; 77 | font-weight: 500; 78 | padding: 10px 20px; 79 | } 80 | .btn-outline-prem{ 81 | border: 1px solid #bbbbbb; 82 | padding: 10px 20px; 83 | color: #f7f7f7; 84 | margin-left: .5em; 85 | } 86 | 87 | .btn-invite:hover, .btn-outline-prem:hover{ 88 | color: #f7f7f7; 89 | } 90 | .btn-outline-prem:hover{ 91 | background-color: #dfdfdf; 92 | color: #0a0a19; 93 | text-decoration: underline; 94 | } 95 | .logo-main{ 96 | width: 21rem; 97 | height: 21rem; 98 | position: relative; 99 | bottom: 5rem; 100 | } 101 | .about-title{ 102 | color: #ebebeb; 103 | letter-spacing: 1px; 104 | text-transform: uppercase; 105 | } 106 | 107 | .par-info{ 108 | background-color: #161625; 109 | position: relative; 110 | top: 5px; 111 | right: 4px; 112 | padding: 9px 14px; 113 | border-radius: 8px; 114 | border: 2px solid #5e5ac9; 115 | } 116 | 117 | .accordion-collapse{ 118 | background-color: #161625; 119 | outline: none; 120 | } 121 | footer{ 122 | background-color: #161625; 123 | height: 9vh; 124 | padding-top: 2rem; 125 | } 126 | footer p{ 127 | font-weight: 700; 128 | } 129 | .wave-footer{ 130 | position: relative; 131 | top: 3rem; 132 | } 133 | 134 | /* width */ 135 | ::-webkit-scrollbar { 136 | width: 10px; 137 | } 138 | 139 | /* Track */ 140 | ::-webkit-scrollbar-track { 141 | background: #1c1c2e; 142 | } 143 | 144 | /* Handle */ 145 | ::-webkit-scrollbar-thumb { 146 | background: #5e5ac9; 147 | border-radius: 30px; 148 | } 149 | 150 | /* Handle on hover */ 151 | ::-webkit-scrollbar-thumb:hover { 152 | background: #4b48a8; 153 | } 154 | @media screen and (max-width: 700px){ 155 | .logo-main{ 156 | width: 16rem; 157 | height: 16rem; 158 | position: relative; 159 | bottom: 1rem; 160 | margin-top: 6%; 161 | margin-right: 22%; 162 | } 163 | } -------------------------------------------------------------------------------- /public/css/premium.css: -------------------------------------------------------------------------------- 1 | 2 | .col-prem{ 3 | background-color: #161625; 4 | margin: 1rem; 5 | border-radius: 5px; 6 | padding: 18px 22px; 7 | border: 2px solid #5e5ac9; 8 | transition: 0.2s all; 9 | } 10 | .col-prem:hover{ 11 | background-color: #5e5ac9; 12 | transition: 0.2s all; 13 | cursor: pointer; 14 | transform: translateY(-10px); 15 | } 16 | .num-count{ 17 | font-size: 22px; 18 | color: #bbbbbb; 19 | } 20 | .fa-crown, .fa-money-bill-wave, .fa-hourglass-end{ 21 | font-size: 3rem; 22 | position: relative; 23 | top: 3px; 24 | } 25 | .fa-crown{ 26 | color: rgb(224, 203, 84); 27 | } 28 | .fa-money-bill-wave{ 29 | color: #43b581; 30 | } 31 | .fa-hourglass-end{ 32 | color: #f04747; 33 | } 34 | .col-ic{ 35 | margin-left: 10%; 36 | } 37 | .card{ 38 | background-color: transparent; 39 | } 40 | .card-head{ 41 | padding: 16px 18px; 42 | background-color: #161625; 43 | border-top-left-radius: 10px; 44 | border-top-right-radius: 10px; 45 | } 46 | .card-body{ 47 | background-color: #242438; 48 | border-bottom-left-radius: 10px; 49 | border-bottom-right-radius: 10px; 50 | } 51 | .btn-add{ 52 | border: 2px solid #43b581; 53 | color: #fff; 54 | padding: 8px 22px; 55 | border-radius: 30px; 56 | } 57 | .btn-add:hover{ 58 | background-color: #43b581; 59 | color: #fff; 60 | } 61 | .main-bot-sec{ 62 | background-color: #161625; 63 | padding: 12px; 64 | border-radius: 5px; 65 | margin-bottom: 1%; 66 | } 67 | .typorgraphy-prem{ 68 | margin-left: 2%; 69 | } 70 | .bot-img{ 71 | position: relative; 72 | bottom: 11px; 73 | } 74 | .bot-name{ 75 | font-size: 22px; 76 | letter-spacing: 1px; 77 | } 78 | .bot-tag{ 79 | color: #c0c0c0; 80 | font-size: 18px; 81 | } 82 | .exp-time{ 83 | font-size: 16px; 84 | color: #bbbbbb; 85 | position: relative; 86 | top: 7px; 87 | } 88 | .btn-invite-prem{ 89 | background-color: #5e5ac9; 90 | color: #f7f7f7; 91 | font-weight: 500; 92 | padding: 9px 18px; 93 | position: relative; 94 | top: 10px; 95 | margin-right: 3%; 96 | border: 2px solid #5e5ac9; 97 | } 98 | .btn-invite-prem:hover{ 99 | color: #fff; 100 | background-color: transparent; 101 | border: 2px solid #5e5ac9; 102 | } 103 | #overlay { 104 | position: fixed; 105 | display: none; 106 | width: 100%; 107 | height: 100%; 108 | top: 0; 109 | left: 0; 110 | right: 0; 111 | bottom: 0; 112 | background-color: rgba(0,0,0,0.5); 113 | z-index: 2; 114 | cursor: pointer; 115 | } 116 | .credits-charge{ 117 | width: 40%; 118 | margin: 0px auto; 119 | margin-top: 10%; 120 | } 121 | .leave-overlay{ 122 | color: #f04747; 123 | font-size: 24px; 124 | } 125 | .btn-close{ 126 | color: #f04747; 127 | font-size: 22px; 128 | } 129 | 130 | .chose-am-t{ 131 | position: relative; 132 | top: 12px; 133 | } 134 | .btn-mount{ 135 | border: 2px solid #5e5ac9; 136 | font-size: 18px; 137 | margin-left: 2%; 138 | margin-bottom: 2%; 139 | } 140 | .btn-mount:hover{ 141 | background-color: #5e5ac9; 142 | } 143 | @media screen and (max-width: 375px){ 144 | .bot-name{ 145 | font-size: 14px; 146 | } 147 | .bot-tag, .exp-time{ 148 | font-size: 14px; 149 | } 150 | .btn-invite-prem{ 151 | padding: 9px 5px; 152 | top: 3px; 153 | left: 7px; 154 | font-size: 15px; 155 | } 156 | .bot-img{ 157 | width: 50px; 158 | height: 50px; 159 | } 160 | .main-bot-sec{ 161 | width: 110%; 162 | position: relative; 163 | right: 16px; 164 | } 165 | } 166 | @media screen and (max-width: 411px){ 167 | .bot-name{ 168 | font-size: 14px; 169 | } 170 | .bot-tag, .exp-time{ 171 | font-size: 14px; 172 | } 173 | .btn-invite-prem{ 174 | padding: 9px 5px; 175 | top: 3px; 176 | left: 7px; 177 | font-size: 15px; 178 | } 179 | .bot-img{ 180 | width: 50px; 181 | height: 50px; 182 | } 183 | .main-bot-sec{ 184 | width: 109%; 185 | position: relative; 186 | right: 15px; 187 | } 188 | .credits-charge{ 189 | width: 90%; 190 | } 191 | } -------------------------------------------------------------------------------- /Images/undraw_Faq_re_31cw.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /views/pages/premium.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <% include ../layout/head %> 4 | 5 | <% include ../layout/navbar %> 6 |
7 |
8 |
9 |
10 |
11 | 12 |
13 |
14 |
Bots Owned
15 | 14 16 |
17 |
18 |
19 |
20 |
21 |
22 | 23 |
24 |
25 |
Bots Expired
26 | 3 27 |
28 |
29 |
30 |
31 |
32 |
33 | 34 |
35 |
36 |
Your Credits
37 | 64$ USD 38 |
39 |
40 |
41 |
42 |
43 |
44 |

45 | Bots Owned 46 | 47 |

48 |
49 |
50 |
51 | 52 |
53 |

54 | ServerBot#4433 55 |

Ends on 27 days

56 |

57 |
58 | 59 |
60 |
61 | 62 |
63 |

64 | ServerBot#4433 65 |

Ends on 27 days

66 |

67 |
68 | 69 |
70 |
71 | 72 |
73 |

74 | ServerBot#4433 75 |

Ends on 27 days

76 |

77 |
78 | 79 |
80 |
81 |
82 | 83 |
84 |
85 |

86 | Bots Expired 87 | 88 |

89 |
90 |
91 |
92 | 93 |
94 |

95 | ServerBot#4433 96 |

Expired since 12 days

97 |

98 |
99 | 100 |
101 |
102 | 103 |
104 |

105 | ServerBot#4433 106 |

Expired since 7 days

107 |

108 |
109 | 110 |
111 |
112 | 113 |
114 |

115 | ServerBot#4433 116 |

Expired since 7days

117 |

118 |
119 | 120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |

128 | Choose Amount (Will be added to your balance) 129 | 132 |

133 |
134 |
135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |
144 |
145 |
146 | <% include ../layout/footer %> 147 | 148 | <% include ../layout/script %> 149 | 150 | -------------------------------------------------------------------------------- /views/pages/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | <% include ../layout/head %> 4 | 5 | <% include ../layout/navbar %> 6 |
7 |
8 |
9 |

Listen to your favourite music with your friends 😉

10 |

11 | <%= client.user.username %> offer the best qullity to listen to your music with 24/7 uptime 12 |
13 | Invite <%= client.user.username %> to your server now! 14 |

15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 |
23 | Logo-bot 24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |

About Us

32 |

33 | <%= description %> 34 |

35 |
36 |
37 | Logo-bot 38 |
39 |
40 |
41 |
42 |
43 |

All Commands

44 |
45 |
46 |

47 | 50 |

51 |
52 |
53 | Explan: 54 |

55 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and 56 | scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic 57 |

58 | Usage: 59 |

60 | #play helloWorld [Args] 61 |

62 |
63 |
64 |
65 |
66 |

67 | 70 |

71 |
72 |
73 | Explan: 74 |

75 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and 76 | scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic 77 |

78 | Usage: 79 |

80 | #play helloWorld [Args] 81 |

82 |
83 |
84 |
85 |
86 |

87 | 90 |

91 |
92 |
93 | Explan: 94 |

95 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and 96 | scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic 97 |

98 | Usage: 99 |

100 | #play helloWorld [Args] 101 |

102 |
103 |
104 |
105 |
106 |

107 | 110 |

111 |
112 |
113 | Explan: 114 |

115 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and 116 | scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic 117 |

118 | Usage: 119 |

120 | #play helloWorld [Args] 121 |

122 |
123 |
124 |
125 |
126 |

127 | 130 |

131 |
132 |
133 | Explan: 134 |

135 | Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and 136 | scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic 137 |

138 | Usage: 139 |

140 | #play helloWorld [Args] 141 |

142 |
143 |
144 |
145 |
146 |
147 | <% include ../layout/footer %> 148 | 149 | <% include ../layout/script %> 150 | 151 | --------------------------------------------------------------------------------