#topgg-api

1 messages Β· Page 45 of 1

restive otter
#

well, if it does get spammed again, re block it

arctic arch
#

hmm

#

no spam according to CF rn

#

unbanned

restive otter
#

thx

alpine plaza
#

I can't get the server count to work

#

help me

arctic arch
#

what's your error

distant ibex
#

I hate to basically ask to be spoonfed, but I really don't understand how to make the webhooks work, what do you use for the link?

raw sparrow
#

your server url:port and the auth token you wanna use to confirm the post request comes from discordbots org

distant ibex
#

I have the auth token set up, I just don't understand the link

raw sparrow
#

you put the url in there where you gonna accept POST requests from dbl like: http://yourServerURL.com:port/votes

distant ibex
raw sparrow
#

same - you gotta decide where the requests from dbl should go to (where your bot is hosted)

distant ibex
#

Alright, thanks

median flicker
#

How can I get it to do that?

plain timber
#

your bot Pug already does it

median flicker
#

I did it

#

thank you

#

I read the docs

#

@plain timber sorry for the ping, but does that mean 100+ in all or this month

#

for the upvotes

plain timber
#

120 in the month

median flicker
#

120??

plain timber
#

yes

median flicker
#

Ahh

median flicker
#

I can't figure out how to lock my command for have to vote!!!

#

Ive read the docks but idk what to do with

#
    if (votes.find(vote => vote.id == "95579865788456960")) console.log("Tonkku has voted!!!")
});```
plain timber
#

Are you using dblapi.js?

median flicker
#

Yes

#

And I can't figure out how to implement this into my code

#

@plain timber

#

ping if someone can help

sand hazel
#

you better off using webhooks

median flicker
#

I'm listening?

#

Webhooks to require the user to vote to use a command?

sand hazel
#

webhook to record votes?

median flicker
#

I want to lock a command

sand hazel
#

then use a webhook WaitWhat

#

literally what I said

median flicker
#

such as?

sand hazel
#

what you mean such as

median flicker
#

What webhook

sand hazel
#

🀦🏾

median flicker
#

🀦🏾

#

wow

sand hazel
#

@plain timber this is urs

plain timber
#

To use DBL webhooks to votelock commands you will need to store votes in a database

median flicker
#

alright

plain timber
#

Or you could just use dbl.hasVoted

median flicker
#

Whatever is easiest

sand hazel
#

just note that the endpoint has rate limit

plain timber
#

Webhooks are recommended but hasvoted is easier to implement tbh

sand hazel
#

1/60 up to 60 burst

median flicker
#

what's an example of locking a command with .hasVoted

sand hazel
#

and hasVoted has a cache, iirc

plain timber
#

I'm sure there's an example in the docs

#

Lemme check

median flicker
#

I saw that.

#

but i'm not exactly sure hot to use it yet

plain timber
#

There's a code example...

#

Just change console.log(blah) to whatever u want to do if they have voted

sand hazel
#

yeah, uhm, you should prob explain more on the rate limit

median flicker
#

ok thank you

#

what about this frame limit

sand hazel
#

i can already see users getting his api token limited

median flicker
#

hm?

plain timber
#

Wdym 1/60 πŸ€”

#

1 request per minute?

sand hazel
#

1 rps / 60 s, or 60 burst

plain timber
#

I heard the ratelimit was like 20/sec or smth

sand hazel
#

nah

#

60 req per minute

#

so you have 60 burst

#

but once exceeded, it's an hour ban block

median flicker
#

nvm sorry ghost tag

sand hazel
median flicker
#

dbl.getVotes is not a function

sand hazel
#

sh0w code

plain timber
#

I told u to use hasvoted tho

sand hazel
#

both should be a func

median flicker
#
const dbl = require('dblapi.js')
const ms = require('parse-ms')
const Discord = require('discord.js')
const db = require('quick.db')
exports.run = async (client, message, args, config) => {
let timeout = 86400000 // 24 hours in milliseconds, change if you'd like.
    let amount = 500
    // random amount: Math.floor(Math.random() * 1000) + 1;

    let daily = await db.fetch(`daily_${message.author.id}`);


dbl.getVotes().then(votes => {
    if (votes.find(vote => vote.id == "500844395092901888")) 


    if (daily !== null && timeout - (Date.now() - daily) > 0) {
        let time = ms(timeout - (Date.now() - daily));
    let embed = new Discord.RichEmbed()
    .setAuthor(`Daily`, message.author.displayAvatarURL)
    .setColor("GREEN")
    .setDescription(`**You have already collected your daily reward**`)
    .addField(`Collect again in`, `**${time.hours}h ${time.minutes}m ${time.seconds}s**`)

        message.channel.send(embed)
    } else {
    let embed = new Discord.RichEmbed()
    .setAuthor(`Daily`, message.author.displayAvatarURL)
    .setColor("GREEN")
    .setDescription(`**Daily Reward**`)
    .addField(`Collected`, amount)

    message.channel.send(embed)
    db.add(`money_${message.author.id}`, amount)
    db.set(`daily_${message.author.id}`, Date.now())
        
  
    }});
}
#

idk

plain timber
#

That's not how u use ut

sand hazel
#

so you didn't even construct a client

plain timber
#

You can't do const dbl= require

sand hazel
plain timber
median flicker
#

I did the first one

#

webhook auth

#

I don't know what any of that means

#

why is this so hard to fetch a vote

sand hazel
#

seems easy to me

median flicker
#

ok I did that step or whatever

#

const DBL = require('dblapi.js');
const dbl = new DBL(yourDBLTokenHere)

#

and of course I changed the token

#

What's next?

#

..

#

whatever

sand hazel
#

now do the func call

#

is the doc that complex

#

it's literally 3 lines of code

short forge
#

do all api requests require tokens

loud gulch
#

read the docsβ„’

short forge
#

when i try to do a GET request for total votes i get 401 oof

#

oh

#

thank

topaz wyvern
#

yw

restive otter
#

Hey guys.

#

I want to know how to see how many bot's my servers in, I assume it is something to do with the API.

#

I've installed the DBL api.

#

At the moment it says N/A.

topaz wyvern
#

You can see your bot's guild size normally by <client>.guilds.size

#

Assuming you use javascript

#

DBL Api will POST that

restive otter
#

I do

#

And do I put that in my index.js?

topaz wyvern
restive otter
#

I'll do that now.

#

If it doesn't work I'll tell you.

topaz wyvern
#

Okay

restive otter
#

;-;

#

That's a long token!

#

Client has already been declared?

#

Oh there

sweet cedar
#

Aye

median cedar
#

Has something changed with the /bots/ID endpoint? It no longer allows me to view points and monthlyPoints (I get KeyError). Please ping me with a response. Thank you!

plain timber
#

@median cedar you need to send your API key now

mild burrow
sand hazel
#

ideally it's your public ip

mild burrow
#

with port and path?

sand hazel
#

yeah

mild burrow
#

ok thanks

jolly halo
#

Guys why my brodcast is illegal for API

sand hazel
#

what

shut ibex
#

It's not illegal

#

It's api abuse

sand hazel
#

what's broadcast

vast zodiac
#

probably sending a message to every server or member

wanton pike
#

hey, i have got problem "unauthorized"

#
    at IncomingMessage.res.on (/home/ubuntu/bot/stable/node_modules/dblapi.js/src/index.js:115:25)
    at IncomingMessage.emit (events.js:187:15)
    at endReadableNT (_stream_readable.js:1094:12)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  raw: '{"error":"Unauthorized"}',
  body: { error: 'Unauthorized' },
  status: 401,
  headers:
   { date: 'Sun, 09 Dec 2018 15:21:49 GMT',
     'content-type': 'application/json; charset=utf-8',
     'content-length': '24',
     connection: 'close',
     'set-cookie':
      [ '__cfduid=d7a1f6aa763544be0c6fb3efb864521a51544368909; expires=Mon, 09-Dec-19 15:21:49 GMT; path=/; domain=.discordbots.org; HttpOnly; Secure' ],
     'x-powered-by': 'Express',
     'access-control-allow-origin': '*',
     'access-control-allow-headers': 'Authorization',
     etag: 'W/"18-XPDV80vbMk4yY1/PADG4jYM4rSI"',
     'x-cacheable': 'NO',
     'x-varnish': '306676074',
     age: '0',
     via: '1.1 varnish-v4',
     'strict-transport-security': 'max-age=15552000; includeSubDomains; preload',
     'x-content-type-options': 'nosniff',
     'expect-ct':
      'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
     server: 'cloudflare',
     'cf-ray': '486876b53edbc1ae-IAD' },
  ok: false,
  statusText: 'Unauthorized' }
#

token is ok

arctic arch
#

update to v2.3.0

wanton pike
#

ok, thanks!

restive otter
#

/bots/{bot.id} is giving me 401 Unauthorized even though authorization isn't required?

azure pollen
#

@arctic arch

arctic arch
#

ken u should know 😩

restive otter
plain timber
#

@restive otter all endpoints require authorization now

arctic arch
#

authorization is required now

restive otter
#

oh

plain timber
#

Except widgets

azure pollen
#

i should know but i dont cos im a busy boi

restive otter
#

but i was able to request it without a token just a few minutes ago?

#

and now its saying unauthorized?

#

can someone help me to do a votes number

#

with the api

plain timber
#

@restive otter the authorization requirement was announced 2 months ago and implemented 4 days ago

restive otter
#

ah just found the announcement

#

thanks

#

docs still need to be updated to reflect that

plain timber
#

Yeah docs are really outdated

median flicker
#

I still can't figure out ddblapi.js πŸ˜‘

median flicker
#

I just want to reward my users for upvoting, giving the 200 doughnuts

#

how do I do this?

sand hazel
#

o he's back

jovial pine
#

So my api token is longer than my screen.. how do i copy it

old river
#

triple click

jovial pine
#

oh it does ok thanks

old river
#

could someone explain how to setup a webhook for voting? i havent really done anything like this before so i dont know what to do

plain timber
#

@old river what language?

old river
#

C#

#

i just dont know how to set one up

#

like i have a server i use to run my bot

#

could i use that or something

plain timber
#

you'll need to set up a webserver and receive a POST request sent buy dbl

old river
#

alright

#

thanks for the start

patent estuary
#

Why does it say N/A instead of the server number?

#

Help

mighty shuttle
#

You need to post your server count using the API

patent estuary
#

How?

mighty shuttle
#

What language is your bot in?

patent estuary
#

.js

mighty shuttle
#
const DBL = require('dblapi.js');
const dbl = new DBL(DBLTOKEN);

client.on('ready', () => {
    dbl.postStats(client.guilds.size)
        .then(() => console.log("Posted Stats"))
        .catch(error => console.log(error))
});```
patent estuary
#

Hmmmm

mighty shuttle
#

That should do it

patent estuary
#

That's all?

mighty shuttle
#

Yep

patent estuary
#

Thanks!

#

πŸ˜ƒ

mighty shuttle
#

πŸ‘

patent estuary
#

One more problem

mighty shuttle
#

Sure whats up

patent estuary
#

@obsidian parrot isn't running on dblapi.js
It's running on discord.js

#

So, will this code work?

mighty shuttle
#

What you do is run npm i dblapi.js

#

In the console and it will install the package so that should work

patent estuary
#

Ok

#

Tysm

#

:)

mighty shuttle
#

No worries tell me if there are any errors

patent estuary
#

Ok

cobalt sinew
#

Quick question regarding the rules, I am planning on letting people do a daily command only when they have voted. is this seen as vote locking?

loud gulch
#

no

#

well yes

#

you made the command vote only it is vote locking

cobalt sinew
#

alright, then I will try to just use the webhook stuff. I might go and ask some stuff if I need some help

loud gulch
#

huh

cobalt sinew
#

I'll just let the bot give the reward by checking if they have voted.

loud gulch
#

thats still votelocking the fuck

polar mirage
#

I think he wants to reward people that vote

arctic arch
#

thats rewarding

polar mirage
#

But claiming the reward with a command

#

That they can't use if they didn't vote

#

So it's vote locking but not rly

loud gulch
#

ok

cobalt sinew
#

shortly said, what pokecord does

graceful verge
#

lol

hoary timber
#

Did the Webhook-thing change?

#

Like for votes.

clever rock
#

Theres no announcement so I dont think so

hoary timber
#

Because idk if it's the site, or something in my bot, because Votes do no longer get processed by my bot (it either doesn't receive any or something else happens)

#

Looks like a check is messing stuff up....

#

Even tho it shouldn't since it's a basic "If vote received and bot enabled, do stuff"

shut ibex
#

Need more information

lavish bane
#

Moved πŸ˜„

cyan ruin
#

right so

#

what lib do you use

lavish bane
#

Discord.js

cyan ruin
lavish bane
#

Oke theres that code

#

I also installed dblapi

kind pier
#

How would I make a voter-only command?

sand hazel
#

did you read the doc

kind pier
#

maybe....

sand hazel
#

that's a no

kind pier
#

;-;

sand hazel
#

link is in the channel's topic

young cliff
#

Read the docs

kind pier
#

okay

#

@sand hazel I have read the docs and I don't understand what they are saying

sand hazel
#

boi

young cliff
#

;-;

sand hazel
#

which part

kind pier
#

everything @sand hazel

sand hazel
#

you speak English?

kind pier
#

yes

#

I am new to this type of coding and have no fucking clue how I am going to do this

young cliff
#

Learn coding

sand hazel
#

which lang πŸ‘πŸΎ

kind pier
#

I want to know how to have a command for only people who have voted for my bot

sand hazel
#

which lang mock

kind pier
#

d.js

#

@sand hazel

sand hazel
#

webh00k

young cliff
#

Suggest, take the codecmady Js course before continuing working on your bot. This will, a.) Helps you learn Js, b.) Make it easier for you to understand the docs.

kind pier
#

okay

#

@young cliff i have no fucking clue how to use webhooks, but everything else, fucking easy

young cliff
#

That's why I suggested to take the course

kind pier
#

oof

#

okay

sand hazel
#

do you even know what a webhook is

young cliff
#

If you want to expanded your understanding of Js, then I would recommend sololearns Js course. This course is long, but will teach you everything about js

sand hazel
#

tbh

#

if you just work on this project

#

then google around

#

you prob learn more hands-on

young cliff
#

Lol

sand hazel
#

i learn more hands-on than any course will offer me

#

google is your friend

young cliff
#

But definitely take codecmady before programming

#

It will give you a running start

sand hazel
#

but uh, the doc pretty much spoonfeeds you

#

the webhook

young cliff
#

Yea

#

We are such a great team, lol

sand hazel
#

who

young cliff
#

You and me, lol

sand hazel
young cliff
#

πŸ€”

sand hazel
#

it literally spoonfeeds you

kind pier
#

ik

#

but how do I get the path of the webhook?

sand hazel
#

you make the path

young cliff
#

Lol

kind pier
#

HOW?

#

that is what I have been trying to figure out

#

@young cliff , @sand hazel

sand hazel
#

hi

#

there's doc

young cliff
#

Why was I pinged, I thought fishy was taking care of this ;-;

kind pier
#

oof

#

sorry

young cliff
#

It's ok

latent sparrow
#

quick question in the line const dbl = new DBL(yourDBLTokenHere, { webhookAuth: 'password', webhookServer: server }); would i put a " around the DBLtoken?

#

i assume i do, but my code doesn't work so im checking to make sure

plain timber
#

it would be better to store your token in a different file such as a .env or a config.json

#

but yes its a string so you will need ", ', or ` around it

latent sparrow
#

@plain timber thanks, and good idea about the .env part (sorry for the ping)

plain timber
#

yw

latent sparrow
#

ok, so i just might be a dummy but im currently trying to run this in my bot

const DBL = require('dblapi.js');
const express = require('express');
const http = require('http');

const app = express();
const server = http.createServer(app);
const dbl = new DBL(yourDBLTokenHere, { webhookAuth: 'password', webhookServer: server });

dbl.webhook.on('ready', hook => {
  console.log(`Webhook running with path ${hook.path}`);
});
dbl.webhook.on('vote', vote => {
  console.log(`User with ID ${vote.user} just voted!`);
});

app.get('/', (req, res) => {
  // ...
});

server.listen(5000, () => {
  console.log('Listening');
});``` Yet when someone votes it doesn't get console logged
#

if im right the way i should have it setup is
https://Name.glitch.me/dblwebhook for url
and password for Authorization

plain timber
#

uh u cant use express and http.createServer

#

gimme a sec

#
const DBL = require('dblapi.js');
const express = require('express');
const http = require('http');

const app = express();

app.get('/', (req, res) => {
  // ...
});

const server = app.listen(process.env.PORT, () => {
  console.log('Listening');
});

const dbl = new DBL(yourDBLTokenHere, { webhookAuth: 'password', webhookServer: server });

dbl.webhook.on('ready', hook => {
  console.log(`Webhook running with path ${hook.path}`);
});
dbl.webhook.on('vote', vote => {
  console.log(`User with ID ${vote.user} just voted!`);
});
humble bison
#

@plain timber you can

latent sparrow
#

I mean the one i had was straight from docs

#

plus the code advaith just gave gives the error Error: listen EADDRINUSE :::3000

plain timber
#

That means you have another webserver using port 3000

latent sparrow
#

Ah

#

I'm a dummy

#

Ok

#

Now i know what that error means

vast zodiac
#

πŸ€” https://www.google.com/search?q=EADDRINUSE

#

google is your best friend

latent sparrow
#

well i mean

#

that it true

#

but i've been known to not be the smartest cookie

fast tapir
#

E: error
ADDR: address
INUSE: you figure this one out

scarlet copper
#

403 Forbidden?

#

when trying to post server count

plain timber
#

@scarlet copper wrong token

scarlet copper
#

i realized that shortly after you said it lol thanks

scarlet copper
#

im pretty sure im not using the wrong token now but i still get the same error

polar mirage
#

You might have to update the dblapi module

sand hazel
#

2.3.0 is the latest

arctic arch
#

if you get 403 when posting stats with dblapi.js it seems like it's because of an ip block

#

you can't get 403 from us when using dblapi

tender mesa
#

Using dblpy I'm getting a constant 403 as well when trying to post server count. Am I using a wrong token? Isn't the right token found at https://discordbots.org/api/docs#mybots ? I've tried regenerating a token but still no change.

tawny oxide
#

are you using dblapi.js

#

if so update to 2.3.0

topaz wyvern
#

(s)he uses dblpy

tawny oxide
#

o nvm im blind

tender mesa
#

I was just asking to see if anyone was experiencing the same problem.

arctic arch
#

403 happens when

  • The ID doesn't match the token
  • Cloudflare blocks you (IP ban)
tender mesa
#

I will check both. Thanks for the info

arctic arch
#

@tawny oxide the upgrade only helps with 401, stat posting is unaffected

tawny oxide
#

ooh okay

tender mesa
#

I fixed the problem. I found out that apparently the script was trying to send the server_count as 0 because it couldn't retrieve it since it wasn't waiting for the bot to get ready.

old river
#

How can I test my HasVoted without a webhook

#

Cause I only see a test button on the webhook section

plain timber
#

@old river just vote for it

#

There's no need to have a test system for hasvotef

old river
#

Oh it’s that easy

#

Ok

#

Lol

plain timber
#

Yw

#

The reason you can test the webhook is the webhook runs right when you vote and you can only vote once every 12h

urban vigil
#

how to request

plain timber
#

@urban vigil what language?

urban vigil
#

discord js

#

i want to check voted

plain timber
#

use dblapi.js

urban vigil
#

ok

#

@plain timber

#

site have problem

#

dbl

plain timber
#

what

urban vigil
#

dont add vote number

plain timber
#

?

urban vigil
#

see

#

220 vote

#

just vote

plain timber
#

no

#

dont advertise

urban vigil
#

no adwersite

#

i find bug

plain timber
#

what bug

urban vigil
#

i just vote but dont + vote number

plain timber
#

was it successful

urban vigil
#

dont update

cobalt ruin
glass maple
#

oh tom scott is cool

#

he is ever posher than jonny

urban vigil
#

oh :))

scarlet copper
#

but why would i be ip blocked on cloudflare

restive otter
#

Oof.

humble bison
#

banned

sand hazel
#

Spam requests

restive otter
#

ok

#

why does my bot's wont count sometimes say 2

#

and sometimes say 16

#

and not go up when i vote

tawny oxide
#

Watch the video above ^^

restive otter
#

πŸ€”

old river
#

how long does it take for a vote to register?

#

like a minute or two?

#

cause it took a few minutes for the api to recognize that i had voted

woeful tundra
#

What do you guys recommend building for a system to manage folks who have voted when enabling rewards?

#

Not currently using a webhook

#

I figure I could keep track of it myself however if someone votes, then waits an hour before claiming their reward then my internal time tracking will be off.

#

As far as I can see the API doesn't provide a date&time for votes.

#

Is the webhook method the only way to accurately keep track of this?

old river
#

no, you can use one of their api packages

#

if your bot gets more than 1k votes in a month however then yes you HAVE to use a webhook

woeful tundra
#

Okay, but how does that solve my issue with times?

old river
#

so you want to be able to check when they voted?

woeful tundra
#

Aye

old river
#

hmm

#

that might be something you can only do with a webhook

#

cause you could check for when it got the POST

#

and save that as the time

#

easier too

woeful tundra
#

Thought so

#

Honestly it's about time I set up a site, just work and effort I don't really want to put forth.

#

Β―_(ツ)_/Β―

#

Guess my time delayed issue will have to do.

#

Actually nevermind, I'm stupid

#

My problem is non existent

old river
#

yeah like for me im being lazy right now and just using the HasVoted check in the api

#

which takes some time to register

woeful tundra
#

If my internal time is accurate and the HasVoted returns false then they should be fine.

old river
#

from my experience itll still return false a few minutes after someone votes

woeful tundra
#

Which should work fine-ish

old river
#

while it updates or whatever

woeful tundra
#

It's annoying they don't provide a date or a timestamp

#

They keep track of it, since its used for the sites internal timer

#

Never hurts to provide it, but its fine.

old river
#

like i said most people just use a webhook

#

so its easy to get a date and time with that

woeful tundra
#

possibly

#

unsure of how i should go about that

#

Could just package my bot into a singular class and run it in the background of an ASP.NET project

old river
#

i havent started making a webhook yet but from my miniscule knowlege you could just create a webserver and host it locally

#

and have the api send posts there

#

you use C# right?

woeful tundra
#

Yes.

old river
#

you can use a weblistener

#

to look for POST requests on your server

#

and read them

woeful tundra
#

I've used them in the past, made a small web server I never got around to finishing

#

wanted an easy system but ran into some issues because my failure to design

#

Not a bad idea actually

#

Easier than having to build my own modifications for it

old river
#

ooo nice

woeful tundra
#

Sure, HttpListener would work fine for a generic listener for the webhook

#

But while I'm at it I might as well try to do something useful

#

web dashboard maybe

#

GrapeVine hasn't been committed to in over a year but it looks promising

restive otter
#

Could you add on the website in the "not waiting approval .." Add like how many not are in line before you so that you can know if things are moving and to get a rough estimate on when you'll be checked

#

Bot

#

Stupid autocorrect

plain timber
#

@restive otter this is only for API help

#

Make a suggestion on the GitHub

restive otter
#

Sorry

#

Where is the github ?

plain timber
restive otter
#

Thanks

humble bison
restive otter
#

sorry

patent estuary
#

Tony....

#

You own a furry...

thorny parrot
#

Why is the api not working with me. .points returns undefined

#

So does the server count.

humble bison
#

@patent estuary i do

#

@thorny parrot check you have an actual bot

thorny parrot
#

I have a bot, else I wouldn't be certified.

#

Wait do I have to supply and API token in my headers now?

old river
#

What language do you use

#

For me I have to supply my bot id and an api token

thorny parrot
#

It worked fine without the token for over a month though

sand hazel
#

@thorny parrot yes

#

It's a recent enforcement, it was announced couple months back

thorny parrot
#

They said it would start on the 5th of november. It worked fine for me even a few days ago.

sand hazel
#

Yeah the change wasn't actually enforced until like a week ago

#

They delayed the original date

old river
#

Btw are votes updated faster using a webhook?

#

I assume yes cause you get the post right away

#

Instead of using just the api where it takes a bit to update

sand hazel
#

Yes

old river
#

Just want to make sure

#

Alright cool

scarlet copper
#

So since i get the 403 Forbidden it might be because heroku is banned

#

im going to get my own vps shortly so that should fix that issue

plain timber
#

You could send the ip to DBL and ask them to unblock it

scarlet copper
#

the prob. blocked it for agood reason, ill just stick with a vps

arctic arch
#

I can check if it's still a problem

restive otter
#

@scarlet copper read above me if u didnt yet

scarlet copper
#

Yes it is, thanks

valid thorn
#

But doest not new DBL returns DBLApi?

sand hazel
#

yes ping oliy

#

dbl does have .webhook

valid thorn
#

@sand hazel its even do not have on('vote')

sand hazel
valid thorn
#

@sand hazel yea, but types do not have that

sand hazel
#

yeah pretty sure the types are auto gen

#

not hand typed

#

and I doubt it's smart enough yet to include declaration in runtimes

valid thorn
#

@sand hazel i do not include them in runtime πŸ˜„

sand hazel
#

What

#

I'm talking about ts type gen

arctic arch
#

types are hand typed

#

I dont see whats wrong tho

honest root
#

Does anyone needs help with c# library? Noticed that not that many people uses cs ._.

granite marten
#

@honest root I think most associate C# with Windows hosting and those kinda servers always tend to be more expensive than Linux ones :/

honest root
#

@granite marten .core works perfectly on Linux

granite marten
#

yea I know, that's why I wrote I think most associate it with windows by default and just leave it there as is

honest root
#

anyways, if anyone needs help with c# - you can ping me

old river
#

@honest root I use C#

#

Best bot lib

onyx sky
#

What is the webhook of the dblapi?

plain timber
#

it lets you do something when a user votes

old river
#

I still need to set that up kek

scarlet copper
#

Any news Tonkku??

arctic arch
#

news on what

restive otter
#

How can I make the webhook od Dbots send a message in my server that says User has voted for my bot ?

plain timber
#

What language?

restive otter
#

node js

#

Proxy the request thought through a webserver

plain timber
#

Use dblapi.js @restive otter

restive otter
#

yea i'll check that

#

oh thx

severe iron
#

API down??

plain timber
#

Probably not

hollow lily
#

How do you make the number of servers or the bot there?
Thank you for answering me πŸ˜ƒ

sand hazel
hollow lily
#

I do not find how we do?

plain timber
#

@hollow lily you want to show on the DBL website? Or somewhere else

hollow lily
#

elsewhere

plain timber
#

Then go to #development and say what lib you're using and what specifically you're trying to do

median flicker
#

Hello!

#
const Discord = require('discord.js');
const db = require('quick.db');


module.exports = function(req, res, bot){
 console.log(req.headers.authorization)

   let amount = 200
       let user = req.body.user

        if(bot.users.get(user)){
           
    db.add(`money_${user}`, amount)

            let embed = new Discord.RichEmbed()
            .setColor('BLURPLE')
        .setThumbnail('https://i.imgur.com/qzuztfO.png')
            .setTitle('Merry Christmas! Thank you so much for voting, ' + bot.users.get(user).tag + '!')
               .setDescription('You upvoting our bot means so much! We will be giving rewards for voting soon! Come back tomorrow!')
            

bot.users.get(user).send(embed).catch((err)=>{});
        }
    
}
#

I know this is an incorrect way to give the user 200 dollars after upvoting, so how can I do so?

idle apex
#

how i can know if someone voted me

#
console.log(`User with ID ${vote.user.tag} just voted!`);``` ?
#

vote.user.tag?

plain timber
#

what language

idle apex
#

Discord.js

plain timber
#

use dblapi.js (this does not replace discord.js this is a lib for the dbl api)

idle apex
#

with name and discrim

plain timber
#

DBL only stores IDs, you should always identify users with IDs

#

never store tags because they can change

zenith river
#

can anyone show me how can I get the id for my bot?

#

I just copy the id

#

of my bot

#

the number is my bot id

#

and yes, I give me that

arctic arch
#

you dont have any approved bots so thats probably why

zenith river
#

oh

#

ok

restive otter
#

hello

#

how does it work in

sand hazel
#

?

karmic veldt
#

So

#

I have DBL setup

#

It posts server stats and all that

#

Bot beside the bots online status

#

It says ???

#

Any reason why? It has server count live updating and all that working fine

loud gulch
#

bot got kicked

karmic veldt
#

Rlly?

#

let me check

#

Why would it have been kicked?

#

Wut

#

@inner venture You got any idea why my bot would've been kicked?

polar mirage
karmic veldt
#

How do I get it back on?

#

If the problem has been fixed

inner venture
#

Well what did it get kciekd for

karmic veldt
#

Must've been early beta

#

Because it works now

#

:/

#

Only released like 3 months ago

inner venture
#

Sure, just link me the dbl page for it

karmic veldt
#

Okay

#

@inner venture Tysm

median flicker
#
const Discord = require('discord.js');
const db = require('quick.db');


module.exports = function(req, res, bot){
 console.log(req.headers.authorization)

   let amount = 200
       let user = req.body.user

        if(bot.users.get(user)){
           
    db.add(`money_${user}`, amount)

            let embed = new Discord.RichEmbed()
            .setColor('BLURPLE')
        .setThumbnail('https://i.imgur.com/qzuztfO.png')
            .setTitle('Merry Christmas! Thank you so much for voting, ' + bot.users.get(user).tag + '!')
               .setDescription('You upvoting our bot means so much! We will be giving rewards for voting soon! Come back tomorrow!')
            

bot.users.get(user).send(embed).catch((err)=>{});
        }
    
}
#

I know this is the incorrect way to give the user money after voting

#

but what is?

sudden rampart
median flicker
#

huh?

sudden rampart
#

someone asked something else, but deleted the message

digital linden
#

after I put a login with discord, the page ignores style.css and my other pages dont work

swift shore
#

what vps does most people use for bots?

topaz wyvern
plain timber
#

@median flicker that code doesn't seem to have anything to do with voting πŸ€”

median flicker
#

it does

plain timber
#

Where

median flicker
#

nvm i fixed it

low oar
#

i keep my bots up using a combo of stuff

#

and none of them are paid services at all like vps

loud gulch
#

how does that relate to the dbl api

restive otter
#

@median flicker what is the right code for that

#

Or does anyone have the code for when someone votes you can thank them in a message on your server

median flicker
#

No but I think you can DM them

restive otter
#

Like

#

gimme a sec

plain timber
#

@restive otter you need to use webhooks

restive otter
#

I can do that

plain timber
#

what language?

restive otter
#

node or python

#

I can edit them either way

plain timber
#

for python you would need to figure out how to set up a webserver

restive otter
#
{ Error: 401 Unauthorized
    at IncomingMessage.res.on (/home/pi/node_modules/dblapi.js/src/index.js:118:25)
    at IncomingMessage.emit (events.js:187:15)
    at endReadableNT (_stream_readable.js:1094:12)
     at args.(anonymous function) (/usr/lib/node_modules/pm2/node_modules/event-loop-inspector/index.js:138:29)
    at process._tickCallback (internal/process/next_tick.js:63:19)
  raw: '{"error":"Unauthorized"}',
  body: { error: 'Unauthorized' },
  status: 401,
  headers:
   { date: 'Sun, 16 Dec 2018 00:46:49 GMT',
     'content-type': 'application/json; charset=utf-8',
     'content-length': '24',
     connection: 'close',
     'set-cookie':
      [ '__cfduid=dd35b3761bfefb409e95f06b7b03526ec1544921209; expires=Mon, 16-Dec-19 00:46:49 GMT; path=/; domain=.discordbots.org; HttpOnly; Secure' ],
     'x-powered-by': 'Express',
     'access-control-allow-origin': '*',
     'access-control-allow-headers': 'Authorization',
     etag: 'W/"18-XPDV80vbMk4yY1/PADG4jYM4rSI"',
     'x-cacheable': 'NO',
     'x-varnish': '61376635',
     age: '0',
     via: '1.1 varnish-v4',
     'strict-transport-security': 'max-age=15552000; includeSubDomains; preload',
     'x-content-type-options': 'nosniff',
     'expect-ct':
      'max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"',
     server: 'cloudflare',
     'cf-ray': '489d22971a2ab765-CDG' },
  ok: false,
  statusText: 'Unauthorized' }```
#

Can someone explains to me

#

whats does it means ?

loud gulch
#

ur either ip banned or need to update

restive otter
#

^

loud gulch
#

or i am completely wrong

restive otter
#

No i think you're right

#

but its something about a website

#

with cloudflare

#

yeah when i'm trying to update guilds count

#

hm

#

tbh it just looks like you don't have access to it

loud gulch
#

@arctic arch whats this issue about again

plain timber
#

ip banned is 403

arctic arch
#

😩 how do people keep mixing up 401 and 403 learn ur response codes

plain timber
#

@restive otter ur probably on an old version

#

or somehow u didnt provide ur api key

restive otter
#

well on DBots It shows the number of guild so i guess it's not the api key

arctic arch
#

make sure the module is at version 2.3.0

restive otter
#

how i do that ?

arctic arch
#

just reinstall the module

restive otter
#

kk

#
npm WARN saveError ENOENT: no such file or directory, open '/home/pi/package.json'
npm WARN enoent ENOENT: no such file or directory, open '/home/pi/package.json'
npm WARN pi No description
npm WARN pi No repository field.
npm WARN pi No README data
npm WARN pi No license field.

+ dblapi.js@2.3.0
updated 1 package and audited 84 packages in 4.379s
found 0 vulnerabilities
plain timber
#

k now its updated

restive otter
#

still the error

jolly leaf
#

Is it normal that the vote's webhook triggers it only 50% the time?

plain timber
#

No

restive otter
#

Where do I find the upvote oauth?

uneven locust
#

Hey guys im an idiot who doesnt know how to use APIs. Can help?

plain timber
#

@uneven locust what are you trying to do?

#

@restive otter wdym

uneven locust
#

Im trying to get memes from r/dankmemes

arctic arch
sand hazel
#

@restive otter what upvote oauth

restive otter
#

I think my developer meant for it to be the token from the dbl page

sand hazel
#

This is for dbl api?

restive otter
#

yeah

sand hazel
#

what you trying to do?

restive otter
#

make a bot that gives people Upvoters rank for voting

#

My developer is asleep now

#

So im kinda left here like

sand hazel
#

It's best you use webhook to record votes, and give ranks that way

restive otter
#

wtf do i do with it

#
from aiohttp import web, ClientSession
import os
import json
import asyncio
import discord

from sites import errors, votes, index
import config


startup_sites = [errors, index, votes]
port = 8082


async def prepare(app):
    app["http_session"] = ClientSession()

    for file in os.listdir("./contents/data"):
        if not file.endswith(".json"):
            continue

        with open("./contents/data/" + file) as f:
            app[file.split(".")[0]] = json.load(f)

    for site in startup_sites:
        await site.setup(app)


async def start():
    app = web.Application()
    app["bot"] = discord.Client()
    app.on_startup.append(prepare)

    runner = web.AppRunner(app)
    await runner.setup()
    site = web.TCPSite(runner, '0.0.0.0', port)
    await site.start()
    print("Listening to localhost:" + str(port))

    await app["bot"].start(config.bot_token)


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(start())
sand hazel
#

talk to your dev

#

and say use webhook

restive otter
#

alright

plain timber
#

Or learn to code yourself

meager hatch
#

Hi hi hi

#

So

#

We're having some problems with the API

#

Does it use any sort of caching?

#

Cause it seems to take some time to realize that the user has voted

sand hazel
#

I believe there's cache

meager hatch
#

Yea

#

My command works like this: it checks if the user has voted, if they haven't, it gives them the link and tells them to run the command again after voting to receive their reward

#

Problem is that due to cache, the API takes some time to realize that the user has voted

#

Is there a way to circumvent this issue?

restive otter
#
Traceback (most recent call last):
  File "C:\Users\Administrator\AppData\Roaming\Python\Python35\site-packages\aiohttp\web_protocol.py", line 378, in start
    resp = await self._request_handler(request)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python35\site-packages\aiohttp\web_app.py", line 341, in _handle
    resp = await handler(request)
  File "C:\Users\Administrator\AppData\Roaming\Python\Python35\site-packages\aiohttp\web_middlewares.py", line 88, in impl
    return await handler(request)
  File "C:\Users\Administrator\Desktop\ThankBot\sites\errors.py", line 7, in error_middleware
    response = await handler(request)
  File "C:\Users\Administrator\Desktop\ThankBot\sites\votes.py", line 14, in index
    data = await request.json()
  File "C:\Users\Administrator\AppData\Roaming\Python\Python35\site-packages\aiohttp\web_request.py", line 543, in json
    return loads(body)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\json\__init__.py", line 319, in loads
    return _default_decoder.decode(s)
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 339, in decode
    obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\json\decoder.py", line 357, in raw_decode
    raise JSONDecodeError("Expecting value", s, err.value) from None
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)```
restive otter
#

Could somebody give me a link to some sought of docs where I can see the api to detect upvotes

sand hazel
#

it's literally in the channel topic PepeHands

restive otter
#

I have never handled api usage before

#

I dont even know where to start

topaz wyvern
#

assuming you use javascript

restive otter
#

Wow thanks

#

Didnt notice that

#

GG

topaz wyvern
#

np

plain timber
#

is the api down? im getting a 520 with dblapi.js

sand hazel
#

what's .ks

graceful verge
#

its keyscript (kinda like typescript)

plain timber
#

No it's a typo of js

graceful verge
#

ik, I was jk

plucky viper
#

why am i unauthorised?

arctic arch
#

dblapi.js?

azure pollen
#

because you didn't authorize /s

plucky viper
#

lol

#

yes dbl

arctic arch
#

make sure it's v2.3.0

plucky viper
#

how do i check if its 2.3.0?

azure pollen
#

in your package.json, otherwise just type npm install dblapi.js again

plucky viper
#

ooo

arctic arch
#

npm list dblapi.js

plucky viper
#

oh shit no wait

arctic arch
#

can show you current version

azure pollen
#

smart tonkku is smart

arctic arch
#

yes

plucky viper
#

i'm using this link https://discordbots.org/api/bots/{botID}

#

sorry

arctic arch
#

so add the authorization header

plucky viper
#

o lol

#

okok

#

but one thing is that when i put https://discordbots.org/api/bots/{botID} to my URL it works

arctic arch
#

you're logged in

plucky viper
#

i mean replace {botID} with an actual ID

#

ok yeah that makes sense ok thanks

restive otter
#

Okay

#

If it returns {}

#

And code 200

#

Inlcuding auth

#

{
"server_count": 400
}

#

What did I do wrong?

#

Ok nvm it was just taking a bit of time

idle apex
#

Photo by: bobthemoose

plain timber
#

Use css and that goes in #development since it's not related to the api

daring gazelle
#

how do i implement voting to my commands

plain timber
#

Explain please

daring gazelle
#

like someone votes and that person gets like a vote crate

plain timber
#

You can use webhooks

#

What language?

daring gazelle
#

python

atomic canopy
#

@plain timber are you selfbotted?

sand hazel
#

w h at

plain timber
#

@atomic canopy no, selfbots are not allowed

primal plank
#

The picture doesn't update

#

Oh wait

#

it does

#

But in embeds it is showing an old image

runic grove
#

give the api time to update

primal plank
#

When I click the pictures link it is correct

#

Just the discord version isnt

#

You see when you click the link?

runic grove
#

it shows 611

little ice
#

cache

runic grove
#

^

primal plank
#

So just my discord isnt correct?

runic grove
#

yes

#

reload discord

#

restart*

primal plank
#

Ah okay thank you 😊

raw sparrow
primal plank
#

Now it works 😱

#

Thank you very much Xavinlol

#

So just something random behind the question mark?

runic grove
#

?random=something

raw sparrow
#

^

runic grove
#

just randomly generate a string or something

raw sparrow
#

but not too long (it broke the image) LUL

little ice
#

wow

#

was pretty smart but never thought of it thanks

primal plank
#

Yes works now thx

little ice
#

i meant logic

raw sparrow
#

i needed it before so i thought might work for that aswell ^^

primal plank
#

7 digits is the limit btw just tested it

primal plank
#

Btw if anyone using NodeJS wanna skid:

let charset = ['e', 'r', 'o', '2', '5', '0', '7', 'm', 'b', 'c', 'u', 'n', 't'];
let random = '';
for (d = 0; d < 6; d++) {
    random = random + charset[Math.floor(Math.random() * charset.length)];
}```
arctic arch
#

interesting charset

primal plank
#

Yes its error2507 and MemberCounter

#

Tonkku is this worth a pin? xD

runic grove
#

membercunt

arctic arch
#

neither

runic grove
#

also, this is better

function randomSelection(choices) {
  return choices[Math.floor(Math.random() * choices.length)];
};```
primal plank
#

No o is second index

runic grove
#

wait thats basically that

#

im actually blind nvm

primal plank
#

Okay Tonkku 😒

smoky plover
#

Hi. I need some help with the javascript lib api. I'm trying to log everytime someone votes, but I don't seem to be able to get it to work. Can someone help me? perhaps by providing an example of how you got it working.

plain timber
#

you need to use webhooks

#

so you'll need to add the code in your bot and add the webhook info in your bot's edit page

#

there is an example in the docs

simple ibex
#

i dont know how to create a commands Vote for Bot In DBL 😦 sad

sand hazel
#

sad indeed

old river
#

quite

tight sparrow
#

Is it possible to make a bot using Python?

#

I am new to the Discord API and have not yet looked into it.

sand hazel
#

yeah...

tight sparrow
#

Cool

restive otter
#

@tight sparrow yes, using discord py or discord py rewrite

tight sparrow
restive otter
#

I recommend going to discord API server for help with that

#

@tight sparrow discord py rewrite

tight sparrow
#

Oh i see

#

Is this not the api server?

#

:/

restive otter
#

Np

#

No

#

Dm me for invite

sand hazel
#

read channel topic

#

read server name

smoky plover
#

@plain timber you mean I need to add the webhook URL in the dev portal of the bot?

#

I've never used webhooks before, sorry if I need more details.

west oxide
#

what is api

weary ember
#

application programming interface

sand hazel
#

Apple pie ingestion

rancid kiln
#

apply penguin intelligence

little harbor
#

alliance of the pretty intelligent

rancid kiln
#

audio penetration interface

shut ibex
short lichen
#

!play

mighty shuttle
rancid kiln
#

is this the normal discord bot token?

plain timber
#

@rancid kiln your bot will need to be approved

#

You can get it from API docs or your bots edit page

rancid kiln
#

okay

restive otter
#

Is it possible to use dblapi.js without discord.js/eris (without a discord bot client)

plain timber
#

Yes

restive otter
#

It tells me: unauthorized when i do:

const dbl = new DBL('SENSORED_TOKEN');
dbl.getBots().then(bots => {...}).catch(console.error);
rancid kiln
#

maan i have to wait and have luck so that i can impliment my dbl command :(

plain timber
#

@restive otter youre on an old version of dblapi.js

restive otter
#

hmm, i'll try

#

Okay ty, it works now

late dune
#

Hey guys i need help

#

i cant invite any bot to my server

#

and i dont know why

loud gulch
late dune
#

Oh sorry

restive otter
#

@LΓΌck#8946 buy a new computer

sharp elm
#

yea i need some help with the webhook an api s h i t

gaunt zealot
#

Hello

#

I need hype life bot

sand hazel
#

Understandable

sharp elm
#

how to get the amount of servers my bot is in onto the website, ik webhooks and stuff but i am c o n f u s i o n plz h e l p

sand hazel
#

Read the d o c

sharp elm
#

i have but im still c o n f u s i o n

plain timber
#

@sharp elm wot language

sharp elm
#

discord.js

#

i want the server count on the bots page and i already have code for when someone votes it sends a message i just need help with the api s t u f f

#

@plain timber

plain timber
#

So you have the const dbl = new DBL(...) code?

sharp elm
#

yea

#

for the server count and the vote thing

plain timber
#

K so can u paste that line

sharp elm
#

what line you need

plain timber
#

And also what's the name of your client variable

#

The const dbl = new DBL line

sharp elm
#

its just const dbl = new DBL('token', client)

#

without the space

plain timber
#

That should post serve count to the website Thonking

#

In your code do you use client.on or bot.on

sharp elm
#

bot.on

plain timber
#

K so in the const dbl line change client to bot

sharp elm
#

ok

#

const client = new Discord.Client(); change the client to bot yes

#

ok done

plain timber
#

Wait what

#

You have const client bot you're using bot.on???

#

Looks like your code isn't right

#

Did you just copy and paste it Thonking

#

Cuz if you used const client that would mean that bot.on wouldn't work

#

Unless you did const bot too

sharp elm
#

i wrote it but wrote it from the docs

#

fixed it

#

i thought i was using client but im using bot y e e t

#

fixed

restive otter
#

when posting guilds count

loud gulch
#

read the error

restive otter
#
const Discord = require("discord.js");
const client = new Discord.Client();
const DBL = require("dblapi.js");
const dbl = new DBL(token, client);

// Optional events
dbl.on('posted', () => {
  console.log('Server count posted!');
})

dbl.on('error', e => {
 console.log(`Oops! ${e}`);
}) ```
#

this is from the example

#

on the docs

loud gulch
#

well

#

ur evaling it

topaz wyvern
#

yeah i was about to say

#

why are you evaling it

restive otter
#

idk

topaz wyvern
#

are you trying to use DBM with this?

little ice
#

Lol

topaz wyvern
#

.

loud gulch
#

suicide is against tos

arctic arch
#

that's a wrong way to put it

loud gulch
#

oh ok

plain timber
#

Suicide is illegal

sterile sleet
#

actually

#

under S1 of the Suicide Act 1961 it is legal in the UK

plain timber
#

Oof

restive otter
#

creepy

slow forge
#

.

lost compass
#

Hi

#

what can i do with getVotes?

#

my bot has 6 votes

#

after dbl.getVotes().then(votes => { message.channel.send(votes.length)
returned 383

#

is it array?

arctic arch
#

getVotes is currently returning wrong cached responses
I recommend trying out webhooks for now

lost compass
#

idk work with it :/

arctic arch
#

on weekends votes are doubled

lost compass
#

oh :/

#

why? πŸ˜„

#

🀣

#

what is password in webhooks?

arctic arch
#

because we have a weekend multiplier

#

you decide the password

lost compass
#

where will i use it?

arctic arch
#

on the receiving side for verification

lost compass
#

oh i dont understand this πŸ˜„
i used code on website, created another variable
got -Webhook running at http://0.0.0.0:5000/dblwebhook
it took like 20 secs from bot start

arctic arch
#

now you need to add information on the edit page of your bot

#

replace 0.0.0.0 with your server's public IP for webhook url

#

and password is what you set in the code

lost compass
#

im not hosting my bot in my pc

#

will it still work?

#

can someone vote to test it? πŸ˜„

arctic arch
#

did you mean to say you are hosting it on your pc

lost compass
#

im not

arctic arch
#

there is a test button

#

so you have a VPS?

lost compass
#

what test button? πŸ˜„ im confused

arctic arch
lost compass
#

oh

arctic arch
#

on glitch you have to use port 3000 for it to work

lost compass
#

my project is not running webpage πŸ˜„

#

its just server side + packages

#

i deleted everything else

#

maybe it did something

rancid kiln
#

so, where can i find my token for the api now Thonk

lost compass
rancid kiln
#

oh

#

ty

lost compass
#

np

#

where is the webhook sender?

#

pls

#

@arctic arch Please where is the tester?

arctic arch
#

on the edit page

#

below the form

lost compass
#

link?

#

cant see it

#

oh edit

#

i sent webhook

#

what will it do?

arctic arch
#

it sends a test webhook

lost compass
#

or needs /vote or whatever

arctic arch
#

that should be correct with the defaults

lost compass
#

what can i expect now to happen?

arctic arch
#

you should receive a vote event

lost compass
#

oh

arctic arch
#

make sure to save before testing btw

lost compass
#

oh

#

ty

#

works

#

omg im still having problems with JSON files in glitch, they are being deleted...

#

idk why

restive otter
#

you should just use heroku to host it it's way easier

arctic arch
#

heroku doesn't have storage

lost compass
#

now the glitch deleted customcommands of 2 servers 😦 πŸ˜„

#

i saved prefixes

#

btw this server is blocked from my bot πŸ˜„

#

we wont read any commands from here

shut ibex
#

ok

vast zodiac
#

you could always use a real host

noble sand
#

lol

#

why do you think it's called, glitch?

snow sky
#

@arctic arch, I'm getting a 401 Unauthorized for retrieving bot info, should I gen a new API token or is it something else?

shut ibex
#

Every endpoint requires auth

snow sky
#

i know, but i already have a token

arctic arch
#

if you're using dblapi.js, update to v2.3.0

snow sky
#

oh ok

#

thanks