#development
1 messages Β· Page 288 of 1
i can't believe it's already at 1.17 GiB wth π
speed is random
uhhh i'm sure you can make it faster by adding --depth 1
It's a 70ish percent, probably not worth it anymore
π
i should change the readme example
ppl shouldn't fetch the entire repository lmao
at least i have unlimited mobile data 
What are the requirements exactly?
It's trying to fetch libs in /usr/local/lib but that's not on macOS
it just wanted that folder to exist all good
Rust
that's all
you need to build it
looks all good
π₯
i've tested it only in windows π
Can have a try on a linux vm, have one set up
Yeah 
Yeah that was just a tiny bit faster 
Yeah works also fine, I just had to manually move the lib to the folder
Not sure if that can be changed, but the binding works so π₯
WHAT πππ
Yeah I did a cp and solved it so was all good
Maybe you can also create the folder if it doesn't exist, considering it's ran as sudo either way?
I had to create it myself
create the folder?
/usr/local/lib
oh it does not exist? π
I didn't have the lib, it's not per default
that's crazy
Yeah, had some issues with carbon as well with that

Now I can implement your lib much much sooner than expected π₯
Honestly didn't expect you to do it so quickly
the new release is not out yet lmfao π
but thanks so much β€οΈ
i definitely did not use chatgpt
Yeah I mean I can still use it π

@radiant kraken ever used clang for c/c++?
what is your OS?
how did you install it?
even though I have the win 11 dev kit installed via vs
I installed the LLVM clang and Windows 11 dev kit is installed via Visual Studio
If this helps idk
i mostly work with vscode
oh i was about to tell ya 
I set the -DCMAKE_RC_COMPILER to be the llvm-rc
nice!
what are you working on?
Right now, just learning C++
but I want clang setup cause clang = better errors typically

I will be using cmake yeah
Right now just following The Cherno's guides and just updating myself on what C++ basics are like though I anticipate they will be familiar

Anyone wanna explain what this asm does
I vaugely understand it
but after googling what eax and such mean I don't really get it
eax is some sort of register?
@radiant kraken
Question
In C++ or even C, headerfiles can just be declerations right?
like
void Log(const char* message)

and then you'd have a cpp file that defines what Log is
But I also know you can literally just do it all in the header file
So why make a cpp file for that header file
like Log.h and Log.cpp
Granted this is such a super basic example
but I am wondering why even have cpp files if you can do everything in header files
minus your main cpp file
well if multiple C++ files include the same header file and they use the same functionality, wouldn't that introduce duplicates when compiling and linking?
if you split them into two files, header and source, you can make use of the advantage of linking, keeping them all intact and reducing duplicated code when linking and compiling
that's what i know
I see
since #include essentially just pastes the header contents
like A would include C and B would include C, if you compile and link A and B together you would have two instances of C
Right
but if you build for release, wont it see those 2 includes and combine it into just 1 ?
Like say A and B both need iostream
surely it won't include iostream twice right?
unsure
i don't think the C++ standard library is header-only
sure there are inline and templated functions/classes, but some of it shouldn't be written in headers
i'm sure the C++ standard library has its own library file
like .so/.dll
so unless you're writing templated/inline functions/classes, there are not much reasons for you to write everything in a header file (especially if it's being used across several source files)
I only ask because when I made the vector implementation I did it all in a h file
#ifndef VECTOR_VECTOR_H
#define VECTOR_VECTOR_H
#include <stdexcept>
template <typename T>
class Vector {
T *array;
size_t capacity;
size_t length;
void resize_to_fit(size_t index) {
int newCapacity = capacity;
while (newCapacity <= index) {
newCapacity *= 2;
}
T* temp = new T[newCapacity];
memcpy(temp, array, sizeof(T) * capacity);
capacity = newCapacity;
delete[] array;
array = temp;
}
public:
Vector() : capacity(1), length(0), array(new int[1]){};
explicit Vector(size_t size)
: capacity(size), length(1), array(new int[size]){};
size_t size() const { return length; }
inline void push_back(T element) { insert(length, element); }
void insert(size_t index, T element) {
if (index >= capacity) {
resize_to_fit(index);
}
if (index >= length) {
length = index + 1;
} else {
length++;
}
array[index] = element;
}
T &operator[](size_t index) const {
if (index >= length) {
throw std::range_error("index out of range");
}
return array[index];
}
~Vector() { delete[] array; }
};
#endif // VECTOR_VECTOR_H
yeah
you mean templated like this?

Itβs like generics but more powerful. Templates are usually written in headers because of compilation performance & bc itβs a little easier that way
me after I add a new rule
hmm, interesting. Still, a bit outside my scope for this, but good to know nonetheless.
Gotcha thanks
Is there still like method/func generics?
Itβs similar but not the same
Gotcha
yuuuhhhh!!

Made a transpiler from C++ to luau
class Player
{
public:
int health;
void takeDamage()
{
health = health - 10;
}
}
local Player = {}
Player.__index = Player
function Player.new()
local self = setmetatable({}, Player)
self.health = 0 --[[ int ]]
return self
end
function Player:takeDamage(self)
self.health = self.health - 10
end
return Player
Transpiler is made in ts granted
so no actual C++ skill

Honestly was just bored

you're fine!
don't worry!
i often feel bored too
i need ideas for my bot
i need a vote reward after my bot gets accepted
what should be the reward
Something worth voting
I guess there's a fortunate side effect for the bot approval process taking 2 - 3 weeks. Those that submit bots then abandon them typically happen in that time frame haha
That's highly subjective to you and your bot's niche. For example, I have several commands that people can use that earn virtual currency. Then I have another command that allows premium players to execute them all at once rather than individually. When my bot is approved, I'll allow those with a certain vote streak to be able to use that command as well.
oh man i made another mistake while updating my service π it uses sveltekit and i just switched to bun from node, and tried using a bun adapter for sveltekit not knowing the adapter was unmaintained and so it had issues
this made it so when doing stuff like post, put, patch etc requests give a forbidden error
i didnt experience this issue during development, it was only in production
and this buggy version of the service was up for 8 hours π π
so cooked
and the worst part is i saw someone trying to log in through my analytics
and they never were able to login because of this issue
i need ideas for commands (theme is fun, games, useful)
rip
why the switch though? just curious, i use node myself
im first timing sveltekit as well and its been pretty awesome so far
honestly not a fan of bun
my bot used bun, i just wanted to switch for the app so it was uh nicer
also i saw using a bun adapter allowed for implementing websockets directly
which was kinda cool and couldve been of use in my app
yess svelte is absolutely awesome

no idea who u are but also not a big fan of you
jk
Just curious: why?
I used Bun to power my last API and it worked really well with zero memory problems (unlike what I've seen in node)
Totally acknowledge that it's not always about the runtime, but the memory consumption of node seemed elevated when compared with bun.
tbh i care a lot about dx so im just gonna say deno is probably my favorite runtime
i wouldve loved to use deno for everything but the support just isnt there yet π’
A lot of the claims of bun about performance are typically not representative of real world scenarios and even within its own web server (using uws.js), its performance is worse than on node
you cant make a SKU purchasable more than once?
nvm fixed myself
didnt have function to consume the SKU for single purchases
and also bc my dumbass would insert the entitlment info AFTER the bot handles it in the database
so i had to swap them
i have no problem with bun or deno or whatever node alternatives there are regarding the implementation, but i dont really like how they randomly cloned a perfectly good project (node) and didnt make any significant changes to the language except for backend architecture which performs basically just as well as node
deno quite literally exists because rust ππ but dont know what motives bun has
i think its just about memory
less memory consumption or something
i have a friend that hypes bun up because of this
probably because he doesnt have much memory to spare during development lol
Wasn't deno also made to fix the pitfalls node had in terms of security as well? I remember that was a big selling point deno made when it was in its earlier versions
dk if that was the main reason or not
yay my bot got approved
It amazes me how segmented js ecosystem is
Can anyone help me related to the voting webhook....
sure
first you find the ip address or url that the could hosting assigned to your instance
then your bot needs to run a webserver to receive the webhooks (top.gg libraries can do this for you)
then in the top.gg website you input the url where your bot can be reached, for example the bot's ip address plus webserver port plus any path you configured
same π₯³
yk, I'm kinda liking generating procedural maps
the gen rules are mostly finished, it's fun going down and seeing how it generates each floor
@quartz kindle 1:100 map incoming
if I freed up some space I could barely get 1:67 too
but thats it lol
1:10 is like 140TB
jesus
Holy
pov you set up renovate π§
pov: what is renovate
automated dependency updates
Why use that over dependabot?
Better configuration/features and supports more languages/filetypes
Renovate documentation.
So all I need is ip Only??
Quite good and honest comparison
generally ip, port and path
ip is defined by the host, port and path are defined by the application
although some hosts limit which ports you can use
for example, using a regular VPS:
host gives you ip 999.999.999.999
you install and configure topgg sdk for your prefered programing language
you set it to port 3000 and path "/topgg"
in your top.gg bot page, you will use the following url: http://999.999.999.999:3000/topgg
depending on your hosting provider, you may also need to configure its firewall to allow that port
aight done, I think
No clue what I'm looking at it but seems awesome
the map for my dungeon crawler game
players descend node by node, one of the dungeons is an infinitely deep one
Holy cow that is awesome
so I made a procedural generator for it
next step is integrating into the game, every yellow node will generate a random event
green nodes are rest spots, kinda like a savepoint
oranges will be dangerous encounters, and reds will be bosses
You probably dont want to make that many paths for a floor 1 xD maybe gradual increases
I thought abt it too, but idk what would be a good "breakpoint" for additional paths
Maybe every 10 floors, idk
Depends how long your game is, how many unique events/tiles you have and other special content
There's no length, progress os persistent across sessions
You could look at other floor based games for ideas too
Pretty sure inscription had a mini game of that at one point?
I'll take a look
Yea
I also need to decide whether I'll allow more than 5 nodes per sub-area or keep it low
More nodes mean more events per floor
But the travel per floor is always N or lower, with N being number of sub-areas
You could also give like buff tiles per-floor
Oh I will, that's why I rewrote it to be floor-based instead of free nodes
Also plan on adding visual penalties like "you can only see in a small area around you" or "room types are unknown"
made it max 3 with +1 every 10 floors (capped at 7)
also +1 to minimum every 20 (capped at half max) so you dont get a single room connecting to more than 5 and to make branch choice more impactful
I assume this is non-specific enough to roblox that anyone who knows ts / programming could answer. I have an ECS and in my systems I sometimes need to listen to events thrown by the roblox engine.
Problem is systems run every frame AKA listening to events spawn a new RBXScriptConnection every frame AKA bad performance AKA no good
import { RunService } from '@rbxts/services';
type InferSignalParameters<T> = T extends RBXScriptSignal & { Connect(fn: (...args: infer U) => void): unknown }
? U
: never;
interface EventData {
queue: unknown[][];
idx: number;
}
const dataBySignal = new WeakMap<RBXScriptSignal, EventData>();
RunService.Stepped.Connect(() => {
for (const [_, data] of dataBySignal) {
data.idx = 0;
data.queue = [];
}
});
export function useEvent<I extends Instance, E extends InstanceEventNames<I>>(
instance: I,
event: E,
): IterableFunction<LuaTuple<[number, ...InferSignalParameters<InstanceEvents<I>[E]>]>> {
const signal = instance[event] as RBXScriptSignal;
let data = dataBySignal.get(signal);
if (!data) {
data = { queue: [], idx: 0 };
signal.Connect((...args: InferSignalParameters<InstanceEvents<I>[E]>) => {
data!.queue.push(args);
});
dataBySignal.set(signal, data);
}
const iter = (): LuaTuple<[number, ...InferSignalParameters<InstanceEvents<I>[E]>]> | undefined => {
data.idx++;
if (data.idx <= data.queue.size()) {
return $tuple(data.idx, ...data.queue[data.idx - 1]) as LuaTuple<
[number, ...InferSignalParameters<InstanceEvents<I>[E]>]
>;
}
data.idx = 0;
return undefined;
};
return iter as IterableFunction<LuaTuple<[number, ...InferSignalParameters<InstanceEvents<I>[E]>]>>;
}
I have this, and seemingly it does add everything to the map I make, but the issue is when I use this function, the RBXScriptSignal is never actually fired, thus none of the args/data from said signal are ever returned in the tuple
RunService.Stepped for reference runs every frame prior to physics simulation
Correction the args are not added to the map
For whatever reason
Working on status pages/monitor service for Dev Space.
Does this look good?
I was thinking of adding support for sharded data like discord bot shards using an array or key based shard id.
Does anyone know a bot that can be used to kick people that haven't chatted within a certain time period from servers?
question, is there a way i could add members that aren't verified yet to a section of the server where they can't fetch any members? (Trying to prevent mass scraping)
I'm not sure if that's possible. Things like server members and channels are sent via the API regardless of whether you have access to them in the client or not. This is why it's possible to use plugins that show you "hidden" channels
won't change the fact that discord sends the data
true
if the member isn't verified , add a role with little to no permissions, would that hinder scraping member data?
The problem is that scraping isn't done with clients, but with self-bots that utilize Discord's API. Anything you can do with a bot, you can do with a self-bot pretty much
If a bot without any permission is able to fetch server members, then selfbot will be able to do it too
hmmm, I guess that is a Discord API issue
Ci sono italiani qua dentro?
And that's been the case since the beginning
A few years ago they worked on a way to return the channels you don't have access to as something like "no_access" or whatever else, don't remember
Never got actually implemented, but more irrelevant things did
thats a discord theme
That is unironically an interesting and possibly useful idea
Might implement it, the way I do shit everything's already in place to permit that
Though I won't add a command to automatically kick people, cause seems ass to those who lurk
Yeah itβd be super useful
There used to be a bot called booty bot that would do that but it stopped working like a year and a half ago
Might make it a 2.5.X milestone for me shit then
Have to deal with other things first though
Last major changelog was er
12K characters big LMFAO
I have no idea what youβre talking about but sounds cool π
Still have to work out the kinks now that it's out in prod
there were so many changes in the last major version of my bot that the patch notes wouldn't fit in no less than 4 separate messages
result:
change a shit load of things = a shit ton of things will break
sorry im getting a bit non-technical here, but is there a way to disable dms in a server?
like people wont be able to dm eachother?
Im facing some serious issue with mass-dms its really annoying
oh okay thanks
guys, should i be worried about this error, because it runs fine when i execute it
increase the security level, also works
yup did that
made my own alt identifier as well
chat, does this still work? https://topgg.js.org/
Documentation for @top-gg/sdk
works for me
question, will i lose my early verified badge or will my bot lose the verified status if i change the name of it?
π
When you all send your stats to topgg, do you send both user installs and guild installs? Or just guild installs?
Meaning, do you add the two together and send it?
the label says "server count" so i assume only guild installs
no
@prime cliff is that a bot hoster ?
The docs only show support for server count
https://docs.top.gg/docs/API/bot/#post-stats
@prime cliff ahaa its just say how time the bot was online ?
Yea its a status checker/monitor
Come to dm i want to ask you somethings
Although this project does have an app creation system, you would need to self host it though
i hate discord mobile so much
on desktop that button DOES scroll to the top of the message
that's what you deserve for using the light mode /s
fun(?) fact: i'm unable to code in dark mode
i can't read shit if it's in dark mode
not sure why
Ok
is cloudlfare + nginx rules good enough to prevent damage from ddos attacks

Ddos dosent cause damage though it's essentially a stun xD
well it could bottleneck the db which will have result on the users performance
π
this is what i mean by damage
Also you should setup a firewall that can block incoming connections and you can whitelist cloudflare and your own ip
okay
cloudflare has built in DDoS protection through the proxy
if you have the proxy off it won't. As well as if people attack the IP itself it won't
No
I see
Thank you!
Cloudflare is generally all you need
They have really good protection
why does my vps have such a heartbeat?
@slender wagon do you run a bot on there/
multiple
im literally feeling bad for my vps
its handling very well for a $5 vps
in one of the bots im using discordeno, that one is very calm
the other is running discord.js
that's where the problem starts ig
ya know dark mode doesn't mean you close your eyes, right? /j
@wheat mesa now I know you said you didn't use an ECS much, but I wonder if you could think of a way to get player data inside of a system.
I have tried several ways and they just seem hacky
like they work but it seems to defeat the point of an ECS
Since systems run every frame, trying to access player data inside them without a bunch of null checks which can derail the system seems impossible
global variables for such stuff is fine
@radiant kraken so looked over the code, looks all good honestly
A few things I've noticed:
On line 402 of the bots.go file, there is an unnecessary authorization header , it's already set in the c.createRequest method
Also the rest is mostly how we (i guess) tend to code in Go, not really like
res, err := c.httpClient.Do(req)
if err != nil {
return 0, err
}
But more
res, err := c.httpClient.Do(req)
if err != nil {
return 0, err
}
Go's error handling is already a mess, no need to artificially make the files longer because of it
Comments are sometimes correctly written as
// HTTPClientOption allows for customizing the HTTP client used.
func HTTPClientOption(httpClient HTTPClient) OptionFunc {
// ...
}
Sometimes they're
// Information about your bot's server count
func (c *Client) GetServerCount() (int, error) {
// ...
}
Sometimes non-existent
I think it makes sense to keep the comments always the same and as godoc wants them to be, so like the first one
For the webhook.go file, there's
type wVotePayload struct {
Bot *string `json:"bot"`
// ...
}
func NewWebhookVotePayload(data []byte) (*WebhookVotePayload, error) {
p := &wVotePayload{}
if err := json.Unmarshal(data, p); err != nil {
return nil, err
}
// ...
}
Considering wVotePayload is just used there, I think it makes more sense to do something like
func NewWebhookVotePayload(data []byte) (*WebhookVotePayload, error) {
var p struct {
Bot *string `json:"bot"` // even lowercase is fine, no need to export it
// ...
}
if err := json.Unmarshal(data, &p); err != nil {
return nil, err
}
// ...
}
how about global kuuhakus

thankies! β€οΈ granted i am not that proficient in go hahaha!
No problem ^^
:3
@quartz kindle world generation still running btw (I shouldve used a prefiltered osm pbf instead of filtering it myself)
lmao
Is anyone here actually building the discord activities?
hey anyone knows how to detect slash commands given to other bots ?
and how fibo does that?
As far as I know, they listen to the embeds that are sent in response
You check the author of the message whether it is disboard, check the embed content whether it indicates that a bump was made and set a timer for your bot to mention someone there in two hours
Theoretically, the messages probably have information about what command the response was made from, but you are not able to check whether the vote was made correctly based on this, so you check the content of the embed
I did this exactly but how does it know the user who did it
break down of embed doesn't have that info
fibo is doing smth that I don't know abt
Interaction reply should have interaction_metadata field which should contain this info
I'll look into it
thanks a lot
TL;DR
Bitnami (aka VMware aka Broadcom) is money hungry and moving off open source. They will now use a subscription model for their images and charts
Money hungry or trying to be sustainable? 
Official pricing verification confirms the $50,000-$72,000 annual subscription costs through AWS Marketplace listings and Arrow Electronics distribution agreements. Bitnami Premium costs $50,000 annually and provides unlimited access to 500+ applications, while Bitnami Secure Images requires $72,000 yearly for 280+ hardened applications with advanced security features.
Money hungry
It's been perfectly maintained and sustainable for years

Especially that now it pretty much cannot be used by hobbyist
Unless someone wants to put in the money for that subscription π
anyone using ahrefs with SPA?
i have similar that rewards users for bumping. You listen for embeds from the bot, look for a string (I look for "Bump Done π ") then enter logic
and like he said above pull metadata to find the user who ran it
problem is you need approved for message intent. Still unsure if my use case will be approved :/
if using a framework yes, the framework should handle those for you
does ahref even execute the js like googlebot tho? seems like its not able to see my page contents. I used solidjs with vite. this works perfectly fine with googlebot
it depends how the framework handles it and how bots navigate
usually you want an SPA hyhbrid, that can render the correct page both by browser navigation and by direct url access
well the framework just creates a index.html and then loads script, there no content in that .html
bots usually get the page content by direct url, not by client side navigation
hmm
right
but google loads the script tags in the .html files so there's no problem with seo there
any way to have the same behavior for ahrefbot?
bots dont follow hrefs by clicking on them
they follow them by accessing the url they point to
as a separate request
so they should see whatever you see if you type the full url directly
yeah but ahref is not seeing that
here's what it sees
<html lang="en">
<head>
// stuff
<script type="module" crossorigin src="/assets/index-BEETA0A1.js
"></script>
<link rel="stylesheet" crossorigin href="/assets/index-BlJif3eR.
css">
</head>
<body class="h-dvh">
<noscript>
<p>You need to enable JavaScript to run this app.</p>
</noscript>
<div id="root" class="h-full"></div>
</body>
</html>
you're talking about this? ahrefs.com
ah then idk, you need to check their docs or something
ahrefbot, it doesnt seem to be loading the script tags
i read their article, they claim to load js for SPAs
anyway thanks
guys
i never used vercel before
i created a project from their basic nodejs template
and it always returns 404
i just cloned this https://vercel.com/templates/backend/nodejs-serverless-function-express
how do i get it working? deployment says its deployed in production
the template has an api/hello.ts file, i tried renaming it to index.ts since some answers online said to do that, but still only get 404 lol
nvm figured it out, i had to create a vercel.json file and add routes there, why dont they include this in the damn template? ffs
I'm needing some high frequency, decent core count CPUs for a server I'm gonna be running while being decently cheap. Anyone got any suggestions? This will be for a modded MC server
Datalix offers a range of hosting solutions from shared hosting to dedicated servers.
ryzen servers
I'll take a look if I can't manage to find something laying around my house
Clever affiliate link 
ye
nearly finished integration
Nice you doing Discord components too
now all that remains is making floors gain random mods depending on their seed
the global mods, player pos and player hp are saved across sessions
lord almighty
well, atleast region generation should be multithreaded
for some reason with a 16 thread hard cap but whatever
no
@solemn latch too
I dont get out of bed for $2000 a month
Cap
must be part time
?
@quartz kindle can you tell me why
const orig = { a: 5, b: [1,2,3] }
const deepCopy = structuredClone(orig);
const deepCopy2 = JSON.parse(JSON.stringify(orig))
const shallowCopy = {...orig}
console.log(orig.a === deepCopy.a) // false
console.log(orig.a === shallowCopy.a) // true
console.log(orig.a === deepCopy2.a) // false
What exactly is structuredClone (or even other methods such as using JSON.parse + JSON.stringify) doing to make it so its not equal anymore
Is it different signatures or whatever its called ?
memory addresses
also ur example is wrong
objects are references
all of those are true
They aren't true
if you compared b they wouldnt be
Wrong
I literally just did it in google chrome console
Only one that returned true was shallowCopy
obj1 === obj2 means obj1 equals obj2 in terms of reference, the entry point of the object in memory is the same
buddy
console.log(deepCopy2)
Ah wait sorry I used the wrong example, the one here differs
orig is a object with a nested object and array
const orig = { a: { x: 1}, b: [1,2,3] }
yes, objects are compared via reference, primitives via value
Sorry my fault
Ah I wouldn't
I just didn't know what a deep copy vs a shallow copy really was tbh
π
Someone yapped at me for doing a deep copy of something when they said a shallow copy was fine

shallow copy = obj inside obj will keep being the same, because only the reference is copied
Gotcha
after using rust this made coding js/ts for me so much harder lol
its such a weird concept that everything is a mutable reference without telling you
So modifying a shallow copy won't modify the original?
it will if its an object
for example

Then I am confused, cause someone said I needed to make a shallow copy because modifying the original is unsafe (in context this is for a datastore library for roblox where the returned data is supposed to be readonly)
a = { primitive: 1, object: { test: 10 } }
b = { ...a } // b is a shallow copy of a
b.primitive // this is a full copy of a.primitive and it belongs solely to object b and changing it wont affect object a
b.object // this is a reference to object { test: 10 }, it exists only once, and is accessible from both a and b, changing it from either a or b will change it for both
*changing data inside it
modifying the property value itself wont affect the other object
Then what are these people yapping about
A shallow copy is when every primitive of an object is copied, but the objects within are not copied. They are references internally, so when you do a shallow copy, youβre just copying over the reference of the object to the new object. A deep copy means truly copying each and every property, including nested objects
One object that is shallow copied that has a nested object inside of it will point to the same memory as the object it copied (For the nested objects, not the primitives)
They said make a shallow copy, but if modifying the copy also modifies the original if its an object (which most of the data is) then whats the point ofm aking a shallow copy

probably just a mix up
I don't know anymore, im confused
Arenβt you working with a ts -> lua transpiler?
So the rules of the js engine donβt apply, itβs Luaβs runtime isnβt it?
Nah im not
Ah
Also lua has similar rules in terms of modifying objects from what I recall
why doesnt js have a native way to make a deep copy of an object
a simple recursive function is orders of magnitude faster than any js "recommended"method
Horrendous performance but technically not wrong
lmao
still waiting for u to try rust
something funny
i tested netlify today, because of an issue someone reported
netlify is like an aws lambda, it does edge functions and stuff
but
they build your app in ubuntu 24, and then they deploy it to an aws instance running amazon linux 2
and if your app has native code, it wont work lmao
didnt u already talk about this before sir
i c
and the issue is, native apps built with gcc wont run on older linuxes
which is counter intuitive
instead of being backwards compatible, they are forward compatible
lmao
200kb more for full compat
i was able to run a musl rust app compiled on ubuntu 22 on ubuntu 14
also its not directly because of gcc
its because of ldd
it links your binary to glibc
ye
welcome to the world of docker, where this problem magically gets solved
porque
I was looking at the internals of a game's server side code
public bool Insert(Item item)
{
if (this.itemList.Contains(item) || this.IsFull())
return false;
this.itemList.Add(item);
item.parent = this;
if (!this.FindPosition(item))
return false;
this.MarkDirty();
if (this.onItemAddedRemoved != null)
this.onItemAddedRemoved(item, true);
ItemContainer parent = this.parent?.parent;
if (parent != null && parent.onItemContentsChanged != null)
parent.onItemContentsChanged(item, true);
Interface.CallHook("OnItemAddedToContainer", (object) this, (object) item);
return true;
}
Why the heck are they stopping the insert if the itemlist already contains the item
I understand if its full
Like what if they are allowed to have multiple stacks of said item
I mean it might be a unique list? Like a set structure of some sort
isnt the item amount a property of said item?
its much more efficient having a map of unique items and their quantities than having multiple copies of an item in an array
I honestly have no idea
There's a lot of code in this game's server side that makes no sense
A lot of unused functions
is it roblox?
A lot of game dev is horrendous
Its a unity game
I would take everything with a grain of salt
league of legends spaghetti code says hi
This is the code behind Rust's server
I would definitely not look at the code standards for a large game like Rust
90% of the code is probably βoh yeah Iβll write this for myself, then 5 junior devs will come along later and fuck with it until itβs awfulβ
Lmao
I wanted to mimic the same principal of having an ItemContainer and PlayerInventory classes
Seemed like a good way to organize things
i imagine most early access games have bad code in them
they literally started as an experiment
But I honestly have no idea how the magic of this code works because that Insert function simingly oesn't support stacked items (unless the itemList just keeps increasing the amount and then splits it up in UI based off the amount and some maxStackSize)
That's honestly smart though
hm
I hate working with data
I can never seem to get it right on how to ensure the data exists before doing anything else
copilot to the win. See I thought about making a recursive function that calls itself if need be, but I wasn't sure if that was smart.
if(dataExists) {
// do stuff
} else {
// do other stuff
}
:^)
if(!dataExists) return;
//do stuff with data```
glad I did that long time ago
The issue is the data needs to exist
So I had to keep fetching it until it was no longer undefined
mine was approved thankfully
um... what
you dont have anyway to check when the data you need is available to be fetched or what?
Not really
Itβs a bit weird to code that in this environment
Since the data is loaded on the server, the client isnβt guaranteed to have it
Also would this matter anyway?
Iβd still end up needing to fetch at a later date anyway
there is a big difference between fetching something knowing its there and fetching something hoping its there
if you have to "keep fetching until its no longer undefined" you're doing something very wrong
kinda like trying to make a timer by repeatedly checking in a loop whether enough time has passed
Then whatβs the alternative
Cause I find myself questioning how to write something because a lot of the data is dynamic
Especially since it could be down to whether enough time has passed for it to be loaded into cache
Since data isnβt loaded instantly
Only when PlayerAdded event is fired is data for the player loaded into their state
Well I got it working in a way that doesn't repeatedly check
Instead I subscribe to the getter so that way it will rerun the callback if any changes to the state are made
public static get(player: Player): Promise<EchoesPlayer> {
const existing = this._instances.get(player);
if (existing) return Promise.resolve(existing);
const pending = this._pending.get(player);
if (pending) return pending;
const promise = new Promise<EchoesPlayer>((resolve) => {
const unsubscribe = effect(() => {
const data = getPlayerData(player.UserId);
if (data) {
const wrapper = new EchoesPlayer(player, data);
this._instances.set(player, wrapper);
this._pending.delete(player);
unsubscribe();
resolve(wrapper);
}
});
if (!player.IsDescendantOf(Players)) {
this._pending.delete(player);
unsubscribe();
}
});
this._pending.set(player, promise);
return promise;
}
I found this method
Not sure what the point of the pending map is if instances already exists but apparently it's for "deduplicating" promises or some shit
yes
if the same player is requested multiple times while its pending, the same promise should be returned
once the promise is resolved, the result is delivered everywhere equally
when it comes to async, you always need to think in terms of "what should i do if this function is called again while the previous call is still waiting?"
some triple A games now have the funniest code in them, its not even early access code, im talking 2 years after full release
remember the gta online fiasco?
they had a broken recursive load function that would reload every single already-loaded item every time it would load a new item
it caused the game to take 20-30min to start
some dude got awarded 10k for reporting/fixing it
some of gta's comments are wild too
// dont know what this does but it broke when i removed it. will check soon - update 5 years later, never checked```
use lazy loading
lmao
basically a data wrapper that only initializes when requested
No idea what that means
How does it work though, it just returns the same promise if it already is there, but what if it's not resolved yet?
It'd basically be returning a EchoesPlayer with no data
I am ashamed to say that all my years of coding i never took the oppurtunity to truly learn what promises are
class Lazy<T> {
private final Supplier<T> loader;
private T obj;
private boolean loaded;
public Lazy<T>(Supplier<T> loader) {
this.loader = loader;
}
public T get() {
if (!loaded) {
obj = loader.get();
loaded = true;
}
return obj
}
}
something like this
it doesnt have a value until you call it the first time
Not quite sure how this would work for me
in your case you'd fetch the server value only when you were going to use it, without re-fetching every time
I already do that
I think
import { EquipSlot } from 'shared/util/types';
import { IItem } from 'shared/data';
import { PlayerInventory } from './PlayerInventory';
import { getPlayerData } from 'shared/charm/datastore';
import { Players } from '@rbxts/services';
import { effect } from '@rbxts/charm';
export interface IDataTemplate {
currency: ICurrency;
inventory: IInventory;
equipment: IEquipment;
}
export interface ICurrency {
copper: number;
silver: number;
gold: number;
}
export interface IInventory {
main: Array<IItem>;
belt: Array<IItem>;
wear: Array<IItem>;
}
export type IEquipment = Record<EquipSlot, string>;
export class EchoesPlayer {
private static _instances: WeakMap<Player, EchoesPlayer> = new WeakMap<Player, EchoesPlayer>();
private static _pending: Map<Player, Promise<EchoesPlayer>> = new Map<Player, Promise<EchoesPlayer>>();
public readonly profile: IDataTemplate;
public readonly inventory: PlayerInventory;
public readonly userId: number;
private constructor(
public readonly player: Player,
data: IDataTemplate,
) {
this.userId = player.UserId;
this.profile = data;
this.inventory = new PlayerInventory(this, this.profile.inventory);
}
public static get(player: Player): Promise<EchoesPlayer> {
const existing = this._instances.get(player);
if (existing) return Promise.resolve(existing);
const pending = this._pending.get(player);
if (pending) return pending;
const promise = new Promise<EchoesPlayer>((resolve) => {
const unsubscribe = effect(() => {
const data = getPlayerData(player.UserId);
if (data) {
const wrapper = new EchoesPlayer(player, data);
this._instances.set(player, wrapper);
this._pending.delete(player);
unsubscribe();
resolve(wrapper);
}
});
if (!player.IsDescendantOf(Players)) {
this._pending.delete(player);
unsubscribe();
}
});
this._pending.set(player, promise);
return promise;
}
}
you can make it more elaborate by making it loop as many times as needed until a valid value is returned
Is this what you mean?
or do you mean abstracting the profile even further
so that only when .profile is accessed is it ever fetched
btw effect is a way of subscribing to state aka getPlayerData any time the value in state changes getPlayerData is called again
aka profile loaded it goes from null -> profile
it's almost the same thing yeah
a Promise is an object that holds a future value
it is a reference like any other object, it can be passed around, anywhere you want
you can assign it to multiple variables, in multiple places, it will all reference the same Promise
for example
let promise;
function a() {
if(!promise) {
promise = new Promise(...)
}
return promise;
}
const x = a();
const y = a(); // y contains the exact same promise as x
x.then(...); // both can be awaited or .then()ed
y.then(...); // both will receive the same value at the same time once the promise resolves
it is recommended to do this kind of promise caching to avoid duplicating tasks, for example:
const requestCache = new Map();
function getResource(someParameter) {
if(requestCache.has(someParameter)) return requestCache.get(someParameter);
const promise = fetch(someParameter).then(result => {
requestCache.delete(someParameter); // delete it from cache once its received
return result;
});
requestCache.set(someParameter, promise);
return promise;
}
this way, if getResource is called multiple times in a short time period, it will only actually fetch the resource once, and the result will be shared with all the calls
its basically like "oh we are already fetching what i need? cool, ill join the waiting list for it"
Heya quick question
Can i make a public channel where all the votes are displayed?
or is there some privacy concerns and i shouldnt do that
Should be fine, though I donβt see the appeal behind it
bro junie is fuckin impressive (question was why updatable = false worked with @MapsId in one class but not in the other)
This makes sense gotcha thanks
and I'm not the one to praise AI
Hmm so sending a dm to that person that they voted is better solution?
instead of in a public channel
No I mean there is nothing wrong with putting it in a public channel
I just dont see a reason to do either
They already know they voted, top.gg tells them so when they are done
i meant like they get some reward for it so its gonna uhh idk give them info that it worked and they got it
They should be able to re=run whatever command that needed them to vote to be able to tell that
Need vote to run said command? Let them know
Is it some reward for voting? Tell them about the reward
Either way its fine to put it in a public channel
hmm oke thanks for the ideas β€οΈ
What's the difference between
public containerVolume(): number {
return this.slots.reduce((sum, item) => {
return (sum += item.quantity);
}, 0);
// let total = 0;
// for (let i = 0; i < this.capacity; i++) {
// const s = this.slots[i];
// if (s) total += s.quantity;
// }
// return total;
}
Using reduce and the commented out portion
Does reduce do a loop under the hood as well?
I also realize in the commented out portion that if check is useless
a slot will never be undefined
As the inventory grows dynamically since its not a fixed size
i mean the commented out is faster, even though reduce uses a for under the hood there are additional checks done, as well as calling the function, but @quartz kindle can give better than i can

Gotcha
I figured the for loop was faster
but this begs to question
Why is it just about everything implemented in js is slower compared to doing it yourself

I also just realized
It doesn't really matter what I use, since it's transpiled into luau which could be slow cause idk how roblox-ts handles reduce
Not everyone is Tim
lmao
js is pretty basic in its core, everything else is built on top of this core js
so using the core js directly will always be faster
gotcha
It looks like reduce is transpiled int oa for loop anyway
function ItemContainer:containerVolume()
local _exp = self.slots
-- βΌ ReadonlyArray.reduce βΌ
local _result = 0
local _callback = function(sum, item)
sum += item.quantity
return sum
end
for _i = 1, #_exp do
_result = _callback(_result, _exp[_i], _i - 1, _exp)
end
-- β² ReadonlyArray.reduce β²
local num = _result
-- My for loop
local total = 0
do
local i = 0
local _shouldIncrement = false
while true do
if _shouldIncrement then
i += 1
else
_shouldIncrement = true
end
if not (i < self.capacity) then
break
end
local s = self.slots[i + 1]
if s then
total += s.quantity
end
end
end
return total
end
resulting code
What in the fuck is this, why is my for loop so massive compared to the reduce π
It does
but for whatever reason the official roblox dev who made roblox-ts transpiles loops into while loops
π
function ItemContainer:findSlotByItemId(itemId)
local index = nil
do
local i = 0
local _shouldIncrement = false
while true do
if _shouldIncrement then
i += 1
else
_shouldIncrement = true
end
if not (i < self.capacity) then
break
end
local item = self.slots[i + 1]
if item.itemId ~= itemId then
continue
end
index = i
end
end
return index
end
As you can see
public findSlotByItemId(itemId: ItemId): number | undefined {
let index = undefined;
for (let i = 0; i < this.capacity; i++) {
const item = this.slots[i];
if (item.itemId !== itemId) continue;
index = i;
}
return index;
}
This gets turned into the above
There is probably a reason
or semantics or something
or that translating JS/TS for loops to lua is just harder
"everybody else does it this way so"
I could ask
probably this because of js being fucked
btw how is the game going
Oh uhm
:)
Right so
Going to be a single player game making multiplayer games hurt my brain
@quartz kindle @queen needle
This is apparently why it uses a while loop in some cases instead of a native for loop
ohhh
Right now Iβm working on the inventory system
Iβm trying to make it as extendable as possible so if I want to add more to the game later on itβs not a headache where I have to refactor a bunch of shit
So Iβm taking a lot of consideration into designing the api
that's fair
Right now I have my own player class that I wrap around Robloxβs
It also stores a reference to the player so I donβt need to keep two player variables
u
Guys, I am laying out my inventory system and I am running into a conundrum on design
My inventory is going to be weight based, more items = higher weight. Now I can handle this 2 ways when it comes to adding items to their inventory
- If they are at or going to be past the maxWeight when picking up an item, I refuse to give it
- I allow them to pick it up, and any weight past the maxWeight contributes to encumbrance
Which would you guys prefer as a game mechanic if you were to play a game with an inventory system
I am more leaning towards option 2 myself since that seems to be the most "smooth" approach
Also forces a player to start thinking more on balancing weight/encumbrance
give the player the option to keep or drop an item from the inventory
i like the pokemon go inventory(from my understanding), if i have 392/400 and pick up 10, it lets me pick up 10, but no more, but if it's like 50, that's too much and it won't let me pick it up, so it just has a small threshold of items to go above limit
I mean I dont want to put a hard limit realistically
Because realism is sure you have a "max" weight you can carry, but if need be you can carry more
I do like this idea though
If I was to put a hard limit on weight, i'd do it this way
Allow them to pick it up so long as it doesn't go too far over the maxWeight
especially if it's weight it translates to real ;ife
you carry your max, but if need a lil over your max
I need to be careful with weight distribution though
I need to make the weight system balanced
okay statistics
Like defining what an item weighs
r/woooosh
true
thats over my head
like a distribution graph
what types of items will you have
Weapons, Consumables (food, potions), Armor, Quest Items (which will be weightless), and maybe some other things
Misc ig is another category, such as books, trinkets, scrolls
How would you make it unbalanced?
Honestly I dont think it can be unbalanced unless I apply unrealisitc weight values
Look at other shooter games that do weight (fallout) and slot based inventory like how stuff takes up 2x2 or 1x2 grid
So I just gotta be careful not to do that
Well its not a shooter game
but I get ya
Yeah I was thinking of modeling it after skyrim
i mean i would just think realistically
like no way an apple is half of this weapon
is it on a scale from 0 to 1?
Nah
0-Infinity /j
Imagine picking up a sword and it's weight is : Infinite
π
(Math.random() * (item_name.length + ((Math.random() * items.length) >> 0) >> 0)```
here you go gang
random weight

random weight based on length of items name and amount of items in inventory
Wouldn't that cause problems
oh 100%
shifting right 0 bits twice?
Apple 1 = 5
Apple 2 = 3
floors
π
Is that just a poor manβs floating point to integer conversion
yes
Ah
WEll I am poor
Java, my favorite
~~()
Math.floor()
() >> 0
Sword of God Aetheri weight = 0
π
But nah
I will feed my item list into chatgpt and tell it to give me realisitc weight values
Im sure it can handle 300+ items
never heard of it
Lmao
They all suck
The code quality is usually pretty terrible, even with the βgoodβ models
For something like this it's perfect though
Yeah since thereβs no code involved π
I was tempted to try and vibe code this entire game
but I decided nah I actually want it to be good
While I may not be the best programmer I can definitely do better than shitgpt
I think using AI for new concepts isnβt terrible as long as youβre learning as you go
Letting AI come up with solutions and not understanding them is bad. Allowing your own thoughts to guide the conversation to getting to the solution you want is the key
I try every new one I see and never get a difference lol, they all just produce subpar code and only do what you want if you spend more time promoting than you would writing it
The context window is far too small for LLMs to be genuinely good without hand holding. A good SWE can guide an AI into an elegant solution, but a good SWE can also write said solution themselves
I agree, if you can prompt the AI to create good code, you yourself could write the good code
My least favorite thing is seeing people use it for translations though
Right
So I am thinking since I have 3 points of inventory
Main, Belt and Wear
Main + Belt will affect picking up items, if your maxWeight is reached, you cannot pick up an item that's too heavy, likely have a grace threshold of 5-10lb
Wear's weight will affect movement
They're only terrible when not given appropriate context and augmentation from my experience.
I would qualify myself as a "good SWE" for my company, and it's much faster prompting the AI and working through a plan than it is with myself coding.
My AI usage:
- I interpret the acceptance criteria
- I browse the code, gather context, understand execution entry and flow
- Using something like Claude Code, in plan mode, I give it the files it likely needs to work with, the entry points for it to understand, the acceptance criteria for the current change, and ensure that a
CLAUDE.mdhas the repository structure, development requirements (integration tests, unit tests, minimum coverage, etc.) (me) - Iterate on the plan, ask Claude if it has any suggestions or questions around the change / edge cases I haven't thought of, and get to a step-by-step where it finally seems correct. (me)
- Overlook each change Claude does and ensure that it's following convention (me)
(optional 6. auto-accept once it hits a certain point)
βοΈ And I'll do this process in parallel with up to 3 changes at once using git worktrees.
sometimes i'll use 2 ai's, one to come up with a plan for execution, and then one to execute
Have you used Claude Code?
I would recommend it 100%
It's the only AI tool worth a damn imo
uhh is that the terminal one?
yeah
i've not used it(the terminal scares me)
It doesn't just go crazy β you approve each change iteratively unless you configure it to "auto-accept"
ooh
i use https://trae.ai when i use
oh interesting! I've never heard of this one
Like I've mentioned in this chat, I specialize in generative AI applications for production workloads
it's by Bytedance the same company that owns tiktok
updatePlayerData(this.owner.userId, (data) => ({
...data,
inventory: {
...data.inventory,
currentWeight: this.getWeight(),
[this._containerName]: this.slots,
},
}));
This is valid right?
assuming this._containerName is a valid key in the inventory object
Well hey it works
Now I just have to make sure that the reference to the profile is also updated
Cause right now doing this.inventory it gives stale data from before the item is given
I am thinking
I have a MarkDirty method that will notify when the data needs to be updated
Try junie
I'll give it a shot β does it have a free tier?
For now, I've been using Zed as my primary editor
Yes, but be careful with what you ask, if it's something too complex it'll result in many steps, burning your entire month quota in a day
I once asked it to help me find a way to detect intentional losses in my game, it worked pretty well but it consumed a third of the quota
Lmao
I hate bugs in code
Sometimes, bugs become features
not availble in vsc?
Probably not since it's a jb product
Oops, I totally thought you were a girl Turns out you are a cop got me there
Nah Iβm not a girl
You welcome ^^
It would require me to rethink my current system to do something like that though, unfortunately. May be worth it long term though.
If your current implementation limits expansion you already did something wrong
Nah there's tradeoffs β I took a specific tradeoff to be handle massive scale without much cost / overhead
This is the way my system currently works:
User types /blackjack <bet> ->
POST /discord/interactions endpoint ->
handler routes to the appropriate interaction handler (named intblackjack in this case) ->
interaction handler calls the cmdblackjack which handles business logic (checking balance, instantiating game state), returns the appropriate actions they can take (insurance, double, hit, stand, etc.) ->
interaction handler marshals the DTO to a JSON payload required by discord with the buttons / cards ->
complete
All this happens in under 3 seconds, so I don't need to call back into discord with an interaction update. I respond within the 3 second threshold.
This is using the HTTP interaction handler. No sharding. No websocket gateway. MINIMAL server overhead.
And will likely scale to hundreds of thousands of simultaneous players without problems. Which is crucial since I want to use this API to handle multiple "chatting" experiences. Twitch, Slack, etc.
Right so whatβs the issue then
Since my architecture is stateless, I can't necessarily update the same message within the same execution context. If I want to send 3 separate updates to the same message, I would need to likely "queue" up something to update that message.
Keep in mind, I need to respond within 3 seconds.
What I'm trying to say is: no actual problem. Just won't work with the current way I'm doing it.
Will need to do:
User types /slots <bet> ->
POST /discord/interactions endpoint ->
handler routes to the appropriate interaction handler (named intslots in this case) ->
interaction handler calls the cmdslots which handles business logic (checking balance, instantiating game state), returns the resolved game state, "queue" up something to update the message with the rotating slots
interaction handler marshals the DTO to a JSON acknowledgement payload
complete
... (some time later) ...
the queue fires off -> goes and updates the message
And that entire "queue" process seems complex for something as simple as slots π€£
Another option is to return a 201 acknowledgement, but continue the execution, therefor not need queuing π€·ββοΈ
Hmm... thinks for being my rubber duck! I realized I could simply just update the player's balance ahead of the emojis completing, but still render using a goroutine π thanks @sharp geyser !
Something like this:
func handler(w http.ResponseWriter, r *http.Request) {
// Send immediate response
w.WriteHeader(http.StatusOK)
json.NewEncoder(w).Encode(map[string]string{
"status": "accepted",
"message": "Processing in background",
})
// Start background processing
go func() {
// This runs after the response is sent
time.Sleep(10 * time.Second)
log.Println("Background task completed")
// Process data, update database, send emails, etc.
}()
}
Yeah
So long as you respond ahead of time
Even using the api you can edit interactions within a certain time period as well
It may not be as clean as owo bot
but people have to understand you aren't using a gateway so you can't leverage most of what others do
Yeah exactly
I actually think I can get it just right. I'll likely do something like this (rethinking through this again):
func handler(w http.ResponseWriter, r *http.Request) {
// Parse request data first
var data RequestData
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
http.Error(w, "Invalid JSON", http.StatusBadRequest)
return
}
// Start processing with the parsed data
go func() {
log.Println("this is where I can update the message here", data.ID)
}()
// Respond immediately that we've accepted it
w.WriteHeader(http.StatusAccepted)
json.NewEncoder(w).Encode(map[string]string{
"status": "accepted",
"id": data.ID,
})
}
This isn't catered towards discord, but you get the idea
The goroutine that's running in the background will update the message. The initial message will have rotating emojis.
Once again, @sharp geyser (sorry for that @ yet again haha), just wanted to thank you for showcasing owo's example. It spawned this idea haha
this rust?
Golang
by sharing the code here, yes
@solemn latch worth monitoring btw, iirc that message is that typical "try my game!!!" scam
do i need to download code from github 
the profile also screams that
looks about right
i dont want to find out either 
If its legit and they appeal then fair enough
(unlikely)
would've loved to see the exe π
Yea something is off about that account because their Discord avatar dosen't match up with their connected youtube account avatar, the youtube one also has 3k subs with no content
Maybe I'm mistaken with what you're saying. Are you asking if my project is on GitHub?
actually was replying to the person that ask for a code review then deleted or got banned
Oh haha β sorry about that π
no worries, but I would like to see the code for your bot
Unfortunately, it's not public or else I would love for you to take a look π
It's definitely not conventional by any means
no worries
you use a library wrapper?
I only use discordgo for the typings / structs. Other than that, no. I do my own API handling / routing and all of that
ahhh nice
Admittedly, I don't need a library wrapper for the HTTP interaction response model. It's as simple as wiring up an endpoint and having discord make POST requests to it.
yeah
If you're curious about the bot, it's simply used to gamble π
Im writing a bot to keep track of NFL game data, also has a daily command where the user can earn coins to use to place bets on games
That sounds awesome!
yeah, also adding a kind of lottery game where 3 numbers are drawn twice a day, if the member matches these numbers they get xtra coins
@queen needle @radiant kraken after numerous bug hunts and squashing most if not all of them. The inventory system is existent and functional (somewhat)
No UI for it yet
but at the very least it's server api exists
EchoesPlayer - Wrapper for roblox's default player so I can add my own functionality: https://pastes.dev/H1wDQDI4W0
PlayerInventory - is a helper class that stores useful methods for interacting with a player's inventory: https://pastes.dev/A08FUBKqvO
ItemContainer - is a helper class for defining what a container is, this can be used for the player's distributed inventory or even chests in the world: https://pastes.dev/ESxyWfNP31
What are you building?
A game

What are you using?
which software/website ?
Does anyone know a status / uptime site which I can actually customise to use the response data of my endpoint? Basically I have a fastapi thing with a /ping endpoint which I use ngrok to get a URL for, and then smth like betteruptime or the other main one to show the uptime, however I want to be able to use the data from my endpoint to show like bot uptime and latency and server counts etc on the page. Does anyone know of a free one that can do this? Bonus points if you can use custom domains on it.
If not then I guess I have to go through the pain of making my own thing from scratch again
That sounds like something very custom i've never heard of status services using metadata but that sounds like a neat idea
I tried better stack and uptimerobot but uptimerobot can't use custom domains without paying, and betterstack only lets you use custom .js if you pay. Only other option is make my own and host with vercel but don't really want to spend time doing that.
The hardest part about bot development is not being able to pay for stuff. Docs? Find an alternative. Uptime monitoring? Find an alternative.
For docs stuff i use gitbooks some stuff is paid but it gets the job done and you can use custom domain but you have to use a specific setting
https://astro.build/themes/details/starlight/
i've seen a lot of docs sites start using astro
I'm working on staus page stuff whoch you could try, this project is self hostable or you can use my instance.
I tried gitbook since it's the most used and well known, but custom domain (main thing I wanted) was paid. Ended up making gitbook export to GitHub and used smth called retype to turn that to html and GitHub pages hooked up to custom domain to host it
https://docs.trackerbot.xyz not finished at all but it looks ok
Tracker is a multipurpose Discord bot made for Geocachers, by Geocachers.
The only thing I dislike is how retype doesnt have the like 1 2 3 steps bit
I'll look into that, thanks
Do you have a link where I could see it in action?
Honestly there are more than enough documentation frameworks that are free to use with custom domains
E.g. docusaurus is quite a good one
Just host it on github pages and it's more than enough
The only reason I went with what I did is because I started using gitbook, made quite a bit and then couldn't be asked to remake it on another site
It's just markdown
Go into gitbooks, settings then organization settings and see if you have this option.
This option is your global custom domain which isnt the paid option that is being shown, it's a bit confusing i know :/
bot approved embed should have a link to the bot page..... just a suggestion
the mods logs channels is not an advertising board x)
yeah true...and I see the bot id is provided
I can set a domain but if I want to publish the docs I have to pay
I also cant find that
Ill probs use this, even tho its not a like interactive builder.
oh hold on no its a case of markdown files
so are my existing docs
i need to edit most if not all of the markdown in my current files to be able to work with starlight tho
https://mintlify.com/
mintlify allows to set a custom domain for docs
my bot is online at this very moment, but when adding it to other servers, apparently it is not staying online for other discord users. how can I solve this?
@solemn latch
Updated the demo of it π
https://devspace-demo.fluxpoint.dev/
If anyone wants to check it out.
Server management using docker, game server management minecraft/battleye/source, Discord apps with workspace builder and error logging sentry supported.
The status monitor and page stuff is being worked on.
https://github.com/FluxpointDev/DevSpace






