• Stars
    star
    127
  • Rank 282,790 (Top 6 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 1 year ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Avatar Remix

This project contains code for a Discord bot that will edit friends' profile pictures in fun and sometimes unexpected ways.

avatar remix example

Try it out

Replicate has provided a hosted version of this bot. You can invite the hosted bot to your Discord server, or follow this README to set up and host your own custom version.

How it works

The main functionality of Avatar Remix is provided by instruct-pix2pix, a model based on Stable Diffusion fine-tuned on a large dataset of example prompts generated by GPT-3.

Discord profile pictures are often pretty small, so if necessary it uses Real-ESRGAN to upscale for better results.

This app runs as a Cloudflare Worker and uses the Replicate API to run the above models serverlessly.

request flow

Setup

Install dependencies

This bot runs on Node and its package manager, npm. If you don't already have node and npm set up, following this guide.

Install the bot's dependencies by running:

npm install

Set up external accounts

This bot uses Cloudflare Workers and Replicate. You'll need to:

Create a Discord application

Create a new application on the Discord Developer portal. Give it a name like avatar-remix-bot.

Then, in the "Bot" settings tab of your application, click "Add Bot" (we don't actually need this bot user, but we use its token for convenience...)

See the Getting Started guide on the Discord developer portal for more details.

discord.dev.portal.mp4

NOTE: if you use the code in this project to build or operate an app or bot on Discord, you will need to comply with Discord’s Developer Terms of Service and Policy. Use of this code does not guarantee compliance.

Envars and secrets

Set up envars in wrangler.toml:

  • Update DISCORD_APPLICATION_ID and DISCORD_PUBLIC_KEY with values from the application you created in the previous step.
  • Update WORKER_BASE_URL with the URL of your Cloudflare worker. By default, this URL takes the form https://avatar-remix-bot.<your worker username>.workers.dev.

Use wrangler to store secret tokens for your bot by running the following commands:

  • wrangler secret put DISCORD_BOT_TOKEN - obtain this token by clicking "View Token" on the Bot page
  • wrangler secret put REPLICATE_API_TOKEN - obtain this token from your Replicate account settings

KV store and Queues

This bot uses Cloudflare to host some serverless infrastructure.

First, it uses Workers KV in order to track Replicate jobs and match callbacks with the original jobs. Run the following command to create the KV namespace:

wrangler kv:namespace create AVATAR_REMIX_FOLLOWUPS

Take the output and paste it into wrangler.toml, replacing the placeholder binding for AVATAR_REMIX_FOLLOWUPS.

Second, it uses Cloudflare Queues to stay within Replicate rate limits during periods of heavy load (this isn't necessary unless you think a lot of people will use your app):

wrangler queues create avatar-remix-jobs

Note that Cloudflare Queues are in beta! You might have to enable them manually in the Cloudflare dashboard by going to Workers > Queues.

Publish the Cloudflare Worker

It's time to bring your worker online! Run the following:

wrangler publish

If all went according to plan, you should see something like this:

Uploaded avatar-remix-bot (1.16 sec)
Published avatar-remix-bot (0.67 sec)
  https://avatar-remix-bot.<yourname>.workers.dev
  Consumer for avatar-remix-jobs
Current Deployment ID: f5d24e08-a211-4bae-a573-e513b5355910

If you go to https://avatar-remix-bot..workers.dev, you should see the message "greetings". That means your web application is online and ready to talk with Discord :)

Register your Interactions Endpoint URL

On the "General Information" tab of your Application's settings in the developer portal, scroll down and set the "Interactions Endpoint URL" to the URL of your Cloudflare Worker.

The URL was outputted in the previous step, and typically it is of the form https://avatar-remix-bot..workers.dev.

here's where the interaction endpoint url is set

Once you've clicked Save Changes, Discord will test your endpoint and you will get a success message in the dev portal indicating that your changes have been saved.

Register slash commands

This bots uses a /remix slash command, and you must register the slash command before using it for the first time. Register it by hitting the register endpoint with a POST request:

curl -X POST https://avatar-remix-bot.<yourname>.workers.dev/register

The response will just say "Registered commands".

In the future, you'll have to do this any time you've made a change to commands.ts.

Invite it to your server

Your bot is ready to go! Invite it to your server by constructing an invite URL:

https://discord.com/oauth2/authorize?client_id=<your discord application id>&scope=applications.commands+bot

Replace the client_id above with the DISCORD_APPLICATION_ID you recorded earlier.

That's all! Use the /remix command and start remixing to your heart's content.

partially typed remix command

REMINDER: Make sure your bot complies with the Discord Developer Terms of Service and Policy.

More Repositories

1

discord-api-docs

Official Discord API Documentation
Markdown
5,543
star
2

lilliput

Resize images and animated GIFs in Go
C++
1,923
star
3

manifold

Fast batch message passing between nodes for Erlang/Elixir.
Elixir
1,618
star
4

sorted_set_nif

Elixir SortedSet backed by a Rust-based NIF
Elixir
1,532
star
5

discord-open-source

List of open source communities living on Discord
JavaScript
1,350
star
6

embedded-app-sdk

πŸš€ The Discord Embedded App SDK lets you build rich, multiplayer experiences as Activities inside Discord.
TypeScript
1,219
star
7

focus-rings

A centralized system for displaying and stylizing focus indicators anywhere on a webpage.
TypeScript
1,120
star
8

fastglobal

Fast no copy globals for Elixir & Erlang.
Elixir
1,097
star
9

discord-rpc

C++
983
star
10

airhornbot

The only bot for Discord you'll ever need.
TypeScript
851
star
11

semaphore

Fast semaphore using ETS.
Elixir
718
star
12

react-dnd-accessible-backend

An add-on backend for `react-dnd` that provides support for keyboards and screenreaders by default.
TypeScript
576
star
13

ex_hash_ring

A fast consistent hash ring implementation in Elixir.
Elixir
475
star
14

discord-example-app

Basic Discord app with examples
JavaScript
434
star
15

OverlappingPanels

Overlapping Panels is a gestures-driven navigation UI library for Android
Kotlin
421
star
16

SimpleAST

Extensible Android library for both parsing text into Abstract Syntax Trees and rendering those trees as rich text.
Kotlin
360
star
17

discord-interactions-js

JS/Node helpers for Discord Interactions
TypeScript
345
star
18

access

Access, a centralized portal for employees to transparently discover, request, and manage their access for all internal systems needed to do their jobs
Python
311
star
19

instruments

Simple and Fast metrics for Elixir
Elixir
295
star
20

focus-layers

Tiny React hooks for isolating focus within subsections of the DOM.
TypeScript
292
star
21

discord-api-spec

OpenAPI specification for Discord APIs
237
star
22

discord-oauth2-example

Discord OAuth2 Example
Python
223
star
23

loqui

RPC Transport Layer - with minimal bullshit.
Rust
220
star
24

erlpack

High Performance Erlang Term Format Packer
Cython
211
star
25

cloudflare-sample-app

Example discord bot using Cloudflare Workers
JavaScript
197
star
26

use-memo-value

Reuse the previous version of a value unless it has changed
TypeScript
170
star
27

zen_monitor

Efficient Process.monitor replacement
Elixir
167
star
28

deque

Fast bounded deque using two rotating lists.
Elixir
141
star
29

linked-roles-sample

JavaScript
119
star
30

punt

Punt is a tiny and lightweight daemon which helps ship logs to Elasticsearch.
Go
113
star
31

sample-game-integration

An example using Discord's API and local RPC socket to add Voice and Text chat to an instance or match based multiplayer game.
JavaScript
107
star
32

endanger

Build Dangerfiles with ease.
TypeScript
96
star
33

discord-interactions-python

Useful tools for building interactions in Python
Python
93
star
34

react-base-hooks

Basic utility React hooks
TypeScript
77
star
35

dynamic-pool

a lock-free, thread-safe, dynamically-sized object pool.
Rust
76
star
36

itsdangerous-rs

A rust port of itsdangerous!
Rust
73
star
37

gen_registry

Simple and efficient local Process Registry
Elixir
71
star
38

confetti-cannon

Launch Confetti
TypeScript
47
star
39

discord-react-forms

Forms... in React
JavaScript
44
star
40

discord-interactions-php

PHP utilities for building Discord Interaction webhooks
PHP
40
star
41

babel-plugin-define-patterns

Create constants that replace various expressions at build-time
JavaScript
39
star
42

memory_size

Elixir
30
star
43

eslint-traverse

Create a sub-traversal of an AST node in your ESLint plugin
JavaScript
30
star
44

rapidxml

Mirror of rapidxml from http://rapidxml.sourceforge.net/
C++
29
star
45

gamesdk-and-dispatch

Public issue tracker for the Discord Game SDK and Dispatch
22
star
46

dispenser

Elixir library to buffer and send events to subscribers.
Elixir
17
star
47

eslint-plugin-discord

Custom ESLint rules for Discord
JavaScript
16
star
48

chromium-build

Python
15
star
49

hash_ring

hash_ring
C
14
star
50

limited_queue

Simple Elixir queue, with a constant-time `size/1` and a maximum capacity
Elixir
13
star
51

perceptual

A smarter volume slider scale
TypeScript
13
star
52

discord_vigilante

12
star
53

heroku-sample-app

Example discord bot using Heroku
JavaScript
11
star
54

postcss-theme-shorthand

Converts `light-` and `dark-` prefixed CSS properties into corresponding light/dark theme globals
JavaScript
11
star
55

babel-plugin-strip-object-freeze

Replace all instances of Object.freeze(value) with value
JavaScript
10
star
56

libyuv

our fork of libyuv for webrtc
C++
10
star
57

lilliput-rs

Lilliput, in Rust!
Rust
9
star
58

lilliput-bench

Benchmarker for lilliput
Python
8
star
59

sqlite3

Mirror of sqlite amalgamation from https://www.sqlite.org/
C
7
star
60

openh264

C++
6
star
61

slate-react-package-fork

TypeScript
6
star
62

rlottiebinding-ios

rlottie ios submodule
Starlark
5
star
63

jemalloc_info

A small library for exporting jemalloc allocation data in Elixir
Elixir
5
star
64

libnice

Fork of https://nice.freedesktop.org/wiki/
C
5
star
65

slate-package-fork

JavaScript
5
star
66

libvpx

C
4
star
67

libsrtp

Fork of libsrtp
C
4
star
68

RLottieAndroid

C++
4
star
69

opentelemetry-rust-datadog

Rust
4
star
70

lilliput-dep-source

Convenient source repo for Lilliput's dependencies
3
star
71

slate-hotkeys-package-fork

3
star
72

rules_ios

Bazel rules for building iOS applications and frameworks
Starlark
2
star
73

cocoapods-bazel

A Cocoapods plugin for automatically generating Bazel BUILD files
Ruby
2
star
74

eslint-plugin-react-discord

Fork of eslint-plugin-react
JavaScript
1
star