Giter VIP home page Giter VIP logo

disgo's People

Contributors

arden144 avatar arynxd avatar beachasaurus-rex avatar benricheson101 avatar dependabot-preview[bot] avatar dependabot[bot] avatar eminarican avatar ftqo avatar iangcarroll avatar ikafly144 avatar itasli avatar jkdlgy avatar jolheiser avatar mlnrdev avatar mrredo avatar pringlers avatar satoufuyuki avatar skye-31 avatar thunder33345 avatar tisleo avatar topi314 avatar wldhg avatar wnxd avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar

disgo's Issues

Guild ID nil on slash-commands

Describe the bug
Guild ID is nil on slash-command interactions, even if the command is ran in a guild.

Error
The error which gets logged if there is any:

ERROR recovered from panic in event listener: runtime error: invalid memory address or nil pointer dereference
stack: goroutine 170 [running]

To Reproduce
Steps to reproduce the behavior:

func commandListener(event *events.ApplicationCommandInteractionCreate) {
	data := event.SlashCommandInteractionData()
	if data.CommandName() == "pull-members" {
		fmt.Println(data.GuildID().String())
...

Expected behavior
It's expected to not be nil when the command is ran in a guild.

Screenshots

Disgo Version(please complete the following information):
Very latest (just installed package)

Additional context

Not reconnecting to gateway

Describe the bug
We're experiencing a problem with disgo staying connected to the gateway for long durations (many weeks). We have gateway.WithAutoReconnect(true), but still occasionally log in to discord and see the bot offline, even though the process is still running ok, and other parts of the process are working fine. I'm not exactly certain at which point it goes offline, but looking at the logs for the night, these errors were logged:

Error
The error which gets logged if there is any:

time="2023-09-06T00:52:13Z" level=info msg="Received event" Duration="301.324µs" Event="On Member Joined Voice" Guild=...
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown
2023/09/06 00:52:13 ERROR error while parsing voice gateway event. error: json: cannot unmarshal object into Go value of type voice.GatewayMessageDataUnknown

To Reproduce
Steps to reproduce the behavior:
Run the bot for a very long time

Expected behavior
Not disconnect from gateway

Screenshots
If applicable, add screenshots to help explain your problem.

Disgo Version(please complete the following information):

  • Version v0.16.7

Additional context
Add any other context about the problem here.

Unlicensed dependency

Describe the bug
go-csync, introduced in commit 6c253fa, does not have an open source license. This means that by default, it is fully copyrighted, and cannot be used in open source code.

I filed sasha-s/go-csync#4 to maybe get it open sourced, but this is not guaranteed to happen, and in any case, the version currently used is not open source.

Error
The error which gets logged if there is any:

This package contains unlicensed code, which by default is copyrighted to the original author. You may not use these dependencies without first obtaining a license.

(from FOSSA).

To Reproduce
N/A

Expected behavior
Open source projects can only depend on open source code.

Screenshots
N/A

Disgo Version(please complete the following information):

  • Version 0.6.0 and later

Additional context
Public repositories are not automatically open source.

Getting a user's Bio

Is your feature request related to a problem? Please describe.
i want to scan for invite codes with regex in user's bio

Describe the solution you'd like
add an field with the user's bio

Describe alternatives you've considered
add a function with the user's bio

more collectors

  • Message Collector
  • Reaction Collector
  • ButtonClick
  • SelectMenuSubmit
  • Command
  • UserContextCommand
  • MessageContextCommand

gatewayHandlerMessageReactionAdd event panic

I don't know what causes this,It panics my program
I need help how should I solve this problem
It is recorded in the log that there was no user reaction message before this panic.

Error

 service_stdout: panic: runtime error: invalid memory address or nil pointer dereference

[github.com/disgoorg/disgo/handlers.gatewayHandlerMessageReactionAdd](http://github.com/disgoorg/disgo/handlers.gatewayHandlerMessageReactionAdd)({0x1080270?, 0xc000456320}, 0x122, 0x0, {0xd812f2985c20000, 0xbf3fd9b5812001f, 0xef4943f5e843014, 0xc000d2bd70, 0x0, {0x0, ...}, ...})
/var/lib/jenkins/go/pkg/mod/[github.com/disgoorg/[email protected]/handlers/message_reaction_handler.go:51](http://github.com/disgoorg/[email protected]/handlers/message_reaction_handler.go:51) +0x33f
[github.com/disgoorg/disgo/bot](http://github.com/disgoorg/disgo/bot).(*genericGatewayEventHandler[...]).HandleGatewayEvent(0xc0003ad7a8?, {0x1080270?, 0xc000456320?}, 0xc0001459b8?, 0xc0003ad728?, {0x106e648?, 0xc0004609a0?})
/var/lib/jenkins/go/pkg/mod/[github.com/disgoorg/[email protected]/bot/event_manager.go:111](http://github.com/disgoorg/[email protected]/bot/event_manager.go:111) +0x105
[github.com/disgoorg/disgo/bot.(*eventManagerImpl).HandleGatewayEvent](http://github.com/disgoorg/disgo/bot.(*eventManagerImpl).HandleGatewayEvent)(0xc00022fc80, {0xc000bd05e8, 0x14}, 0x4120a5?, 0x100?, {0x106e648, 0xc0004609a0})
/var/lib/jenkins/go/pkg/mod/[github.com/disgoorg/[email protected]/bot/event_manager.go:136](http://github.com/disgoorg/[email protected]/bot/event_manager.go:136) +0x114
[github.com/disgoorg/disgo/gateway.(*gatewayImpl).listen](http://github.com/disgoorg/disgo/gateway.(*gatewayImpl).listen)(0xc0001d6000, 0xc000248160)
/var/lib/jenkins/go/pkg/mod/[github.com/disgoorg/[email protected]/gateway/gateway_impl.go:421](http://github.com/disgoorg/[email protected]/gateway/gateway_impl.go:421) +0x70c
created by [github.com/disgoorg/disgo/gateway.(*gatewayImpl).open](http://github.com/disgoorg/disgo/gateway.(*gatewayImpl).open) in goroutine 1
/var/lib/jenkins/go/pkg/mod/[github.com/disgoorg/[email protected]/gateway/gateway_impl.go:125](http://github.com/disgoorg/[email protected]/gateway/gateway_impl.go:125) +0x37a

Webhook embed

Describe the bug

Fix this bullshit with discord.NewEmbedBuilder().

discord.NewEmbedBuilder (value of type func() *discord.EmbedBuilder) is not a type

404 not found

Describe the bug
404 not found error

Error
The error which gets logged if there is any:

ERROR error sending message: Status: 404 Not Found, Body: {"message": "404: Not Found", "code": 0}

To Reproduce
Steps to reproduce the behavior:

	if _, err := clientDiscord.CreateMessage(discord.NewWebhookMessageCreateBuilder().
		SetContentf("test 1").
		Build(),
		// delay each request by 2 seconds
		rest.WithDelay(2*time.Second),
	); err != nil {
		log.Errorf("error sending message: %s", err)
	}

Disgo Version(please complete the following information):

  • Version 0.16.9

"nil pointer dereference" after successful startup

After updating to Go 1.18 and to disgo v0.8.3, I began getting nil pointer dereferences upon startup, after the ready event was fired. They only happened when the Guild intent was declared in gateway intents. I thought it was only an issue with my current project, so I copied and pasted the "Ping-pong" example from the README (with a minor change at the bottom, where ChannelServices() was renamed to Channels()), and got the exact same error.

Exact error:

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x808db4]

goroutine 68 [running]:
github.com/disgoorg/disgo/gateway/handlers.(*gatewayHandlerGuildCreate).HandleGatewayEvent(0x4000345cc0?, {0xb9a8b0?, 0x400001a0c0}, 0x3, {0x951a00?, 0x4000312c80})
 	/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/handlers/guild_create_handler.go:90 +0x614
github.com/disgoorg/disgo/bot.(*eventManagerImpl).HandleGatewayEvent(0x40004267d0, {0x40006d9610, 0xc}, 0xc?, {0xb8a820, 0x4000737260})
 	/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:81 +0x128
github.com/disgoorg/disgo/gateway/handlers.DefaultGatewayEventHandler.func1({0x40006d9610, 0xc}, 0x10670?, {0xb8a820, 0x4000737260})
 	/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/handlers/all_handlers.go:25 +0xa0
github.com/disgoorg/disgo/gateway.(*gatewayImpl).listen(0x40003457c0)
 	/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:353 +0x750
created by github.com/disgoorg/disgo/gateway.(*gatewayImpl).Open
	/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:109 +0x4f0

I am running on an M1 MacBook, but I tested the README example in an Alpine Docker container and got the same result.

Return a error on a invalid token

Is your feature request related to a problem? Please describe.
The bot will not return an error when a token is invalid which can lead to a panic.

Describe the solution you'd like
On *.OpenGateway return an error if the bot cannot connect due to a invalid token/un-connectable error, that the user can handle in their nessesary way.

Describe alternatives you've considered
For now I am using latency to discover if the bot's connection was successful before proceeding to continue to actions to prevent said panic.

Additional context
In my case running multiple bots caused the bot to restart via process manager due to a bad overlook on my part with no knowledge of the error occurring that I thought was handled due to the OpenGateway returning a error, I did not understand that a bad token would not give a error for me to handle which in turn caused the main process bot's token to be reset overnight.

Fallback handler for unhandled request on router

Forwarded from discord

Some sort of method that allows user to register a fallback handler on the router
This could be useful for logging unhandled request and spotting potentially missed things

not sure if it make sense to consider wildcards or just fallback for unhandled routes

the only way i can see wildcards being used is on component's custom ids(even so i dont know if it truly make sense)

Add "rest.retryWithDelay()" function?

if my program restarts immediately after reaching the text per minute webhook limit, will disgoorg automatically wait after the restart to send the messages or will it just throw a 429 error?

If it throws 429 error, what's the workaround?
Probably a func that can wait for a specified time between requests?

discord.User.AvatarDecoration not working because discord modified the json payload

Describe the bug
When i try to use discord.User.AvatarDecoration or AvatarDecorationURL() it returns null. When i tried it with postman directly on the api it seems that discord changed the json formatting for the user payload.

Error
The error which gets logged if there is any:

2024/04/07 20:30:59 ERROR recovered from panic in event listener name=bot_event_manager arg="runtime error: invalid memory address or nil pointer dereference" stack="goroutine 27 [running]:\nruntime/debug.Stack()\n\t/usr/local/go1.22.1.linux-amd64/src/runtime/debug/stack.go:24 +0x5e\ngithub.com/disgoorg/disgo/bot.(*eventManagerImpl).DispatchEvent.func1()\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:151 +0x8c\npanic({0x7dfdc0?, 0xbcd940?})\n\t/usr/local/go1.22.1.linux-amd64/src/runtime/panic.go:770 +0x132\nmain.init.func1(0xc0000000c0)\n\t/home/vaporvee/acecore/cmd_info.go:113 +0x514\nmain.applicationCommandInteractionCreate(0xc0000000c0)\n\t/home/vaporvee/acecore/handlers.go:74 +0x204\ngithub.com/disgoorg/disgo/bot.(*listenerFunc[...]).OnEvent(...)\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:64\ngithub.com/disgoorg/disgo/bot.(*eventManagerImpl).DispatchEvent(0xc00007a660, {0x9465d0, 0xc0000000c0})\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:170 +0x142\ngithub.com/disgoorg/disgo/handlers.handleInteraction({0x950a90, 0xc0000a3cc0}, 0x6, 0x0, 0x0, {0x94f530, 0xc0000b4370})\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/handlers/interaction_create_handler.go:43 +0x968\ngithub.com/disgoorg/disgo/handlers.gatewayHandlerInteractionCreate({0x950a90?, 0xc0000a3cc0?}, 0xc00045a2a8?, 0x7cfc40?, {{0x94f530?, 0xc0000b4370?}})\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/handlers/interaction_create_handler.go:16 +0x2f\ngithub.com/disgoorg/disgo/bot.(*genericGatewayEventHandler[...]).HandleGatewayEvent(0x418545?, {0x950a90?, 0xc0000a3cc0?}, 0xc000113320?, 0x100?, {0x948588?, 0xc0002fcb00?})\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:111 +0x4e\ngithub.com/disgoorg/disgo/bot.(*eventManagerImpl).HandleGatewayEvent(0xc00007a660, {0xc0002f63d8, 0x12}, 0x6, 0x0, {0x948588, 0xc0002fcb00})\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:136 +0x12c\ngithub.com/disgoorg/disgo/gateway.(*gatewayImpl).listen(0xc0001e2640, 0xc000133600)\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:421 +0x16ef\ncreated by github.com/disgoorg/disgo/gateway.(*gatewayImpl).open in goroutine 1\n\t/home/vaporvee/go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:125 +0x453\n"

it panics obviously when i use the returned null value

To Reproduce
Steps to reproduce the behavior:

var user discord.User = e.SlashCommandInteractionData().User("user") // get the user from my slash command (other things work with that user value)
logrus.Debug(user.AvatarDecorationURL()) // returns null
logrus.Debug(user.AvatarDecorationURL()) // returns null too

Disgo Version(please complete the following information):

  • Version [e.g. v0.8.3]

Additional context
Also AccentColor seems to be broken too.

nil Member in gatewayHandlerTypingStart causes panic

Describe the bug
Event gateway.EventTypingStart (TYPING_START gateway event) sometimes has non-zero GuildID field, yet nil Member field. This results in nil pointer dereference in default library handler at https://github.com/disgoorg/disgo/blob/master/handlers/typing_start_handler.go#L26 - event.GuildID == nil is false at this point.

Error
Here are the logs for panic:

some-bot-app-1  | panic: runtime error: invalid memory address or nil pointer dereference
some-bot-app-1  | [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xbc9d78]
some-bot-app-1  |
some-bot-app-1  | goroutine 48 [running]:
some-bot-app-1  | github.com/disgoorg/disgo/handlers.gatewayHandlerTypingStart({0x10e19f0, 0xc0000f8840}, 0x25, 0x0, {0xf9415299c442082, 0xc000455830, 0xf00804592c440be, {0x0, 0xedc2a5328, 0x16d1ca0}, ...})
some-bot-app-1  |     /go/pkg/mod/github.com/disgoorg/[email protected]/handlers/typing_start_handler.go:26 +0x1b8
some-bot-app-1  | github.com/disgoorg/disgo/bot.(*genericGatewayEventHandler[...]).HandleGatewayEvent(0xa2?, {0x10e19f0?, 0xc0000f8840?}, 0xc00031a9d8?, 0xc00001b938?, {0x10d4db8?, 0xc000317dd0?})
some-bot-app-1  |     /go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:105 +0xe5
some-bot-app-1  | github.com/disgoorg/disgo/bot.(*eventManagerImpl).HandleGatewayEvent(0xc00022f570, {0xc000455800, 0xc}, 0xc000035a40?, 0xc00001bbf0?, {0x10d4db8, 0xc000317dd0})
some-bot-app-1  |     /go/pkg/mod/github.com/disgoorg/[email protected]/bot/event_manager.go:126 +0x11f
some-bot-app-1  | github.com/disgoorg/disgo/gateway.(*gatewayImpl).listen(0xc0001b9600, 0xc000036b00)
some-bot-app-1  |     /go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:419 +0x979
some-bot-app-1  | created by github.com/disgoorg/disgo/gateway.(*gatewayImpl).open
some-bot-app-1  |     /go/pkg/mod/github.com/disgoorg/[email protected]/gateway/gateway_impl.go:137 +0x7ca

I've added some logging at the application level to inspect the raw payload of TYPING_START events by registering a handler for events.Raw. The code is as following (don't pay attention to naming):

func (e *EventController) OnRawUserTypingStart(event *events.Raw) {
	if event.EventType != gateway.EventTypeTypingStart {
		return
	}

	payload, err := io.ReadAll(event.Payload)
	if err != nil {
		e.logger.Debug(
			"Error while reading body of Raw event TYPING_START",
			slog.String("err", err.Error()),
		)
		return
	}

	e.logger.Debug(
		"Got Raw event TYPING_START",
		slog.String("payload", fmt.Sprintf("%q", payload)),
	)
}

As it turns out, the raw event payload indeed contains guild_id field but no member field. Here are the logs for the last event which caused the panic above:

some-bot-app-1  | time=2023-06-25T15:24:24.166Z level=DEBUG source=/build/internal/bot/handlers/controllers/events.go:80 msg="Got Raw TYPING_START event" package=app payload="\"{\\\"user_id\\\":\\\"1081004946872352958\\\",\\\"timestamp\\\":1687706664,\\\"channel_id\\\":\\\"1122545475581649026\\\",\\\"guild_id\\\":\\\"541260942126874635\\\"}\""

To Reproduce
Steps to reproduce the behavior: can't be reproduced from the application level.

Expected behavior
The library doesn't panic.

Disgo Version(please complete the following information):
Current master, require github.com/disgoorg/disgo v0.16.6

Additional context
The bug isn't a disgo's fault, the incorrect event payload comes straight from discord. I've looked up the gateway events docs for said event, they state that the member field must always be present if the event occurs in a guild, yet it is not.
Actually I've done some research and found out when this happens. I've looked up the user for the last event which caused panic, and noticed that the user is the Clyde bot. My guess is that Clyde isn't considered a member of the guild, thus the absent member field in event payload. This seems to be the case, as Clyde isn't displayed in guild member list and his profile can't be edited by admin.
This time Discord has broken their own API contract. I think the only thing we can do is to add an appropriate nil check in aforementioned handler. Also, I'm not sure if there will be more unforeseen issues with this Clyde bot elsewhere in the codebase.

ProvideOpusFrame Panics, doesn't provide error

Describe the bug
When using OpusReader, I get a panic when reading an Opus file. I've tested the opus file and it plays in VLC, i've no reason to suspect its invalid.

I've no experience streaming audio so this entire thing is a bit of a mystery to me, otherwise i'd try to solve this and send a PR. I'm sort of stumbling in the dark. I see some functions included in the voice package that seem to be there to help with streaming audio over UDP, i'm attempting use them. Though, I noticed the examples, and the documentation both do not use these functions. I'm guessing they just haven't been updated. I'm sure there is more a chance that i've made an obvious mistake.

Error
The error which gets logged if there is any:

panic: runtime error: slice bounds out of range [:1399285583] with length 3840

To Reproduce
Steps to reproduce the behavior:

func writeAudio(conn voice.Conn) error {
	file, err := os.Open("../../audio/file.opus")
	if err != nil {
		return err
	}

	r := voice.NewOpusReader(file)
	b, err := r.ProvideOpusFrame()
	for err != nil {
		conn.UDP().Write(b)
	}
	r.Close()

	return nil
}

The code panics at r.ProvideOpusFrame()

Expected behavior
I would expect the function to return an error, and give me some idea what is going wrong.

Disgo Version(please complete the following information):

  • Version v0.16.9

Recordatory components dont work inside a route (handler)

Describe the bug
Components inside the handler dont work inside a route.

To Reproduce
Steps to reproduce the behavior:
Use handler and put a component inside a route

Expected behavior
The handler should manage correctly the handler

Screenshots
image

Disgo Version(please complete the following information):

  • Version [e.g. v0.16.7]

json unmarshal error on (rest.Channels).GetWebhooks

When I run (rest.Channels).GetWebhooks I get the error below

error unmarshalling response body: json: cannot unmarshal object into Go value of type discord.Webhook

I think it's probably because it's passing []discord.Webhook to rsBody in the (rest.Client).Do function.
So the same thing happens with (rest.Guilds).GetAllWebhooks

webhook.Newclient

Describe the bug
A clear and concise description of what the bug is.

Error
The error which gets logged if there is any:

import "github.com/disgoorg/disgo/webhook"

client := webhook.NewClient(snowflake.ID("webhookID"), "webhookToken")

message, err := client.CreateEmbeds(discord.NewEmbedBuilder().
	SetDescription("hello world!").
	Build(),
)

Expected behavior
Send embeded webhook

Additional context
undefined: webhook.Newclient

Deadlock Bug

After testing I found that rateLimiterImpl.doCleanup will delete expired buckets.
Webhook limits 30 requests per minute. It will cause high concurrency. Because b.mu.CLock is locked. However, the deletion of expired buckets causes the previous request UnlockBucket to fail. Subsequent requests will be deadlocked.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.