Files
website/blog/index.html
2024-07-22 01:04:01 +00:00

293 lines
112 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html><html lang="en" dir="ltr" data-has-toc data-has-sidebar data-theme="dark" class="astro-bguv2lll"> <head><meta charset="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><title>Blog | sern</title><link rel="canonical" href="https://sern.dev/blog/"/><link rel="alternate" hreflang="en" href="https://sern.dev/blog/"/><link rel="alternate" hreflang="es" href="https://sern.dev/es/blog/"/><link rel="alternate" hreflang="tr" href="https://sern.dev/tr/blog/"/><link rel="sitemap" href="/sitemap-index.xml"/><script src="https://analytics.sern.dev/ua.js" data-website-id="db608ae9-3ae2-49ed-9f7c-3ba0d5abe1b6" defer></script><link rel="shortcut icon" href="/favicon.svg" type="image/svg+xml"/><meta name="generator" content="Astro v4.9.1"/><meta name="generator" content="Starlight v0.23.1"/><meta property="og:title" content="Blog"/><meta property="og:type" content="article"/><meta property="og:url" content="https://sern.dev/blog/"/><meta property="og:locale" content="en"/><meta property="og:description"/><meta property="og:site_name" content="sern"/><meta name="twitter:card" content="summary_large_image"/><meta name="twitter:title" content="Blog"/><meta name="twitter:description"/> <meta property="og:title" content="sern - Handlers. Redefined."> <meta property="og:description" content="A modular, customizable, fast Discord.js framework to streamline bot development"> <meta property="og:url" content="https://sern.dev"> <meta property="og:type" content="website"> <meta property="og:image:alt" content="sern logo"> <meta property="og:image" content="https://sern.dev/sern-logo.png"> <meta property="og:image:height" content="512"> <meta property="og:image:width" content="1024"> <meta name="theme-color" content="#F25186"> <meta name="keywords" content="discord, bot, handler, framework, documentation, sern"> <meta name="twitter:title" content="sern - Handlers. Redefined."> <meta name="twitter:description" content="A modular, customizable, fast Discord.js framework to streamline bot development"> <meta name="twitter:image" content="https://sern.dev/sern-logo.png"> <meta name="twitter:url" content="https://sern.dev"> <meta property="twitter:site" content="@sern-handler"><script>
window.StarlightThemeProvider = (() => {
const storedTheme =
typeof localStorage !== 'undefined' && localStorage.getItem('starlight-theme');
const theme =
storedTheme ||
(window.matchMedia('(prefers-color-scheme: light)').matches ? 'light' : 'dark');
document.documentElement.dataset.theme = theme === 'light' ? 'light' : 'dark';
return {
updatePickers(theme = storedTheme || 'auto') {
document.querySelectorAll('starlight-theme-select').forEach((picker) => {
const select = picker.querySelector('select');
if (select) select.value = theme;
/** @type {HTMLTemplateElement | null} */
const tmpl = document.querySelector(`#theme-icons`);
const newIcon = tmpl && tmpl.content.querySelector('.' + theme);
if (newIcon) {
const oldIcon = picker.querySelector('svg.label-icon');
if (oldIcon) {
oldIcon.replaceChildren(...newIcon.cloneNode(true).childNodes);
}
}
});
},
};
})();
</script><template id="theme-icons"><svg aria-hidden="true" class="light astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M5 12a1 1 0 0 0-1-1H3a1 1 0 0 0 0 2h1a1 1 0 0 0 1-1Zm.64 5-.71.71a1 1 0 0 0 0 1.41 1 1 0 0 0 1.41 0l.71-.71A1 1 0 0 0 5.64 17ZM12 5a1 1 0 0 0 1-1V3a1 1 0 0 0-2 0v1a1 1 0 0 0 1 1Zm5.66 2.34a1 1 0 0 0 .7-.29l.71-.71a1 1 0 1 0-1.41-1.41l-.66.71a1 1 0 0 0 0 1.41 1 1 0 0 0 .66.29Zm-12-.29a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.71-.71a1.004 1.004 0 1 0-1.43 1.41l.73.71ZM21 11h-1a1 1 0 0 0 0 2h1a1 1 0 0 0 0-2Zm-2.64 6A1 1 0 0 0 17 18.36l.71.71a1 1 0 0 0 1.41 0 1 1 0 0 0 0-1.41l-.76-.66ZM12 6.5a5.5 5.5 0 1 0 5.5 5.5A5.51 5.51 0 0 0 12 6.5Zm0 9a3.5 3.5 0 1 1 0-7 3.5 3.5 0 0 1 0 7Zm0 3.5a1 1 0 0 0-1 1v1a1 1 0 0 0 2 0v-1a1 1 0 0 0-1-1Z"/></svg> <svg aria-hidden="true" class="dark astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.64 13a1 1 0 0 0-1.05-.14 8.049 8.049 0 0 1-3.37.73 8.15 8.15 0 0 1-8.14-8.1 8.59 8.59 0 0 1 .25-2A1 1 0 0 0 8 2.36a10.14 10.14 0 1 0 14 11.69 1 1 0 0 0-.36-1.05Zm-9.5 6.69A8.14 8.14 0 0 1 7.08 5.22v.27a10.15 10.15 0 0 0 10.14 10.14 9.784 9.784 0 0 0 2.1-.22 8.11 8.11 0 0 1-7.18 4.32v-.04Z"/></svg> <svg aria-hidden="true" class="auto astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> </template><link rel="stylesheet" href="/_astro/index.DpiJ2NF2.css">
<style>:is(.right-sidebar-panel,mobile-starlight-toc){display:none}.main-frame{padding-top:var(--sl-nav-height)}.preview:where(.astro-dr56dw7m){display:flex;flex-direction:column;gap:1.5rem}h2:where(.astro-dr56dw7m){margin-bottom:1.5rem}h2:where(.astro-dr56dw7m) a:where(.astro-dr56dw7m){text-decoration:none}.posts:where(.astro-xaz7kpyh){display:flex;flex-direction:column;gap:3rem}
</style>
<link rel="stylesheet" href="/_astro/Blog.BYBK7FCS.css">
<style>.content-panel:first-of-type{display:none}.content-panel:nth-of-type(2){border-top:none}
.author:where(.astro-kbhsbk7c){align-items:center;display:flex;gap:.5rem;line-height:var(--sl-line-height-headings);text-decoration:none}.text:where(.astro-kbhsbk7c){display:flex;flex-direction:column}.name:where(.astro-kbhsbk7c){font-size:var(--sl-text-base);font-weight:600}.author:where(.astro-kbhsbk7c)[href] .name:where(.astro-kbhsbk7c){color:var(--sl-color-text-accent)}.title:where(.astro-kbhsbk7c){font-size:var(--sl-text-xs);color:var(--sl-color-text)}.author:where(.astro-kbhsbk7c)[href]:hover .name:where(.astro-kbhsbk7c){color:var(--sl-color-text)}img:where(.astro-kbhsbk7c){border:1px solid var(--sl-color-gray-2);border-radius:9999px;height:2.5rem;width:2.5rem}.metadata:where(.astro-2oxtfctb){display:flex;flex-direction:column;gap:.75rem}time:where(.astro-2oxtfctb){font-size:var(--sl-text-sm)}.authors:where(.astro-2oxtfctb){display:flex;flex-wrap:wrap;gap:.75rem 1rem}.badges:where(.astro-2oxtfctb){margin-top:.25rem}.draft:where(.astro-2oxtfctb){background-color:var(--sl-color-orange-low);border:1px solid var(--sl-color-orange);border-radius:.3rem;color:var(--sl-color-orange-high);font-size:var(--sl-text-body-sm);line-height:var(--sl-line-height-headings);margin-inline:.2rem;padding:.25rem .5rem .35rem}ul:where(.astro-sg3lsd66){display:inline;padding:0}li:where(.astro-sg3lsd66){display:inline-block;margin-bottom:.25rem;padding:0}a:where(.astro-sg3lsd66){border:1px solid var(--sl-color-gray-5);border-radius:.3rem;font-size:var(--sl-text-sm);margin-inline:.2rem;padding:.25rem .5rem .35rem;text-decoration:none}a:where(.astro-sg3lsd66):hover{border-color:var(--sl-color-gray-2)}
.card-grid:where(.astro-zntqmydn){display:grid;gap:1rem}.card-grid:where(.astro-zntqmydn)>*{margin-top:0!important}@media (min-width: 50rem){.card-grid:where(.astro-zntqmydn){grid-template-columns:1fr 1fr;gap:1.5rem}.stagger:where(.astro-zntqmydn){--stagger-height: 5rem;padding-bottom:var(--stagger-height)}.stagger:where(.astro-zntqmydn)>*:nth-child(2n){transform:translateY(var(--stagger-height))}}
.card:where(.astro-v5tidmuc){--sl-card-border: var(--sl-color-purple);--sl-card-bg: var(--sl-color-purple-low);border:1px solid var(--sl-color-gray-5);background-color:var(--sl-color-black);padding:clamp(1rem,calc(.125rem + 3vw),2.5rem);flex-direction:column;gap:clamp(.5rem,calc(.125rem + 1vw),1rem)}.card:where(.astro-v5tidmuc):nth-child(4n+1){--sl-card-border: var(--sl-color-orange);--sl-card-bg: var(--sl-color-orange-low)}.card:where(.astro-v5tidmuc):nth-child(4n+3){--sl-card-border: var(--sl-color-green);--sl-card-bg: var(--sl-color-green-low)}.card:where(.astro-v5tidmuc):nth-child(4n+4){--sl-card-border: var(--sl-color-red);--sl-card-bg: var(--sl-color-red-low)}.card:where(.astro-v5tidmuc):nth-child(4n+5){--sl-card-border: var(--sl-color-blue);--sl-card-bg: var(--sl-color-blue-low)}.title:where(.astro-v5tidmuc){font-weight:600;font-size:var(--sl-text-h4);color:var(--sl-color-white);line-height:var(--sl-line-height-headings);gap:1rem;align-items:center}.card:where(.astro-v5tidmuc) .icon:where(.astro-v5tidmuc){border:1px solid var(--sl-card-border);background-color:var(--sl-card-bg);padding:.2em;border-radius:.25rem}.card:where(.astro-v5tidmuc) .body:where(.astro-v5tidmuc){margin:0;font-size:clamp(var(--sl-text-sm),calc(.5rem + 1vw),var(--sl-text-body))}
svg:where(.astro-c6vsoqas){color:var(--sl-icon-color);font-size:var(--sl-icon-size, 1em);width:1em;height:1em}
starlight-tabs:where(.astro-esqgolmp){display:block}.tablist-wrapper:where(.astro-esqgolmp){overflow-x:auto}:where(.astro-esqgolmp)[role=tablist]{display:flex;list-style:none;border-bottom:2px solid var(--sl-color-gray-5);padding:0}.tab:where(.astro-esqgolmp){margin-bottom:-2px}.tab:where(.astro-esqgolmp)>:where(.astro-esqgolmp)[role=tab]{display:flex;align-items:center;gap:.5rem;padding:0 1.25rem;text-decoration:none;border-bottom:2px solid var(--sl-color-gray-5);color:var(--sl-color-gray-3);outline-offset:var(--sl-outline-offset-inside);overflow-wrap:initial}.tab:where(.astro-esqgolmp) :where(.astro-esqgolmp)[role=tab][aria-selected=true]{color:var(--sl-color-white);border-color:var(--sl-color-text-accent);font-weight:600}.tablist-wrapper:where(.astro-esqgolmp)~[role=tabpanel]{margin-top:1rem}
.sl-link-card:where(.astro-mf7fz2mj){display:grid;grid-template-columns:1fr auto;gap:.5rem;border:1px solid var(--sl-color-gray-5);border-radius:.5rem;padding:1rem;box-shadow:var(--sl-shadow-sm);position:relative}a:where(.astro-mf7fz2mj){text-decoration:none;line-height:var(--sl-line-height-headings)}a:where(.astro-mf7fz2mj):before{content:"";position:absolute;inset:0}.stack:where(.astro-mf7fz2mj){flex-direction:column;gap:.5rem}.title:where(.astro-mf7fz2mj){color:var(--sl-color-white);font-weight:600;font-size:var(--sl-text-lg)}.description:where(.astro-mf7fz2mj){color:var(--sl-color-gray-3);line-height:1.5}.icon:where(.astro-mf7fz2mj){color:var(--sl-color-gray-3)}.sl-link-card:where(.astro-mf7fz2mj):hover{background:var(--sl-color-gray-7, var(--sl-color-gray-6));border-color:var(--sl-color-gray-2)}.sl-link-card:where(.astro-mf7fz2mj):hover .icon:where(.astro-mf7fz2mj){color:var(--sl-color-white)}
.sl-steps{--bullet-size: calc(var(--sl-line-height) * 1rem);--bullet-margin: .375rem;list-style:none;padding-inline-start:0}.sl-steps>li{position:relative;padding-inline-start:calc(var(--bullet-size) + 1rem);padding-bottom:1px;min-height:calc(var(--bullet-size) + var(--bullet-margin))}.sl-steps>li+li{margin-top:0}.sl-steps>li:before{content:counter(list-item);position:absolute;top:0;inset-inline-start:0;width:var(--bullet-size);height:var(--bullet-size);line-height:var(--bullet-size);font-size:var(--sl-text-xs);font-weight:600;text-align:center;color:var(--sl-color-white);background-color:var(--sl-color-gray-6);border-radius:99rem;box-shadow:inset 0 0 0 1px var(--sl-color-gray-5)}.sl-steps>li:not(:last-of-type):after{--guide-width: 1px;content:"";position:absolute;top:calc(var(--bullet-size) + var(--bullet-margin));bottom:var(--bullet-margin);inset-inline-start:calc((var(--bullet-size) - var(--guide-width)) / 2);width:var(--guide-width);background-color:var(--sl-color-hairline-light)}.sl-steps>li>:first-child{--lh: calc(1em * var(--sl-line-height));--shift-y: calc(.5 * (var(--bullet-size) - var(--lh)));transform:translateY(var(--shift-y));margin-bottom:var(--shift-y)}.sl-steps>li>:first-child:where(h1,h2,h3,h4,h5,h6){--lh: calc(1em * var(--sl-line-height-headings))}@supports (--prop: 1lh){.sl-steps>li>:first-child{--lh: 1lh}}
starlight-file-tree:where(.astro-p67cqifm){--x-space: 1.5rem;--y-space: .125rem;--y-pad: 0;display:block;border:1px solid var(--sl-color-gray-5);padding:1rem;background-color:var(--sl-color-gray-6);font-size:var(--sl-text-xs);font-family:var(--__sl-font-mono);overflow-x:auto}starlight-file-tree:where(.astro-p67cqifm) .directory>details{border:0;padding:0;padding-inline-start:var(--x-space);background:transparent}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary{margin-inline-start:calc(-1 * var(--x-space));border:0;padding:var(--y-pad) .625rem;font-weight:400;color:var(--sl-color-white);max-width:100%}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary::marker,starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary::-webkit-details-marker{color:var(--sl-color-gray-3)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover,starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover .tree-icon{cursor:pointer;color:var(--sl-color-text-accent);fill:var(--sl-color-text-accent)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover~ul{border-color:var(--sl-color-gray-4)}starlight-file-tree:where(.astro-p67cqifm) .directory>details>summary:hover .highlight .tree-icon{fill:var(--sl-color-text-invert)}starlight-file-tree:where(.astro-p67cqifm) ul{margin-inline-start:.5rem;border-inline-start:1px solid var(--sl-color-gray-5);padding:0;padding-inline-start:.125rem;list-style:none}starlight-file-tree:where(.astro-p67cqifm)>ul{margin:0;border:0;padding:0}starlight-file-tree:where(.astro-p67cqifm) li{margin:var(--y-space) 0;padding:var(--y-pad) 0}starlight-file-tree:where(.astro-p67cqifm) .file{margin-inline-start:calc(var(--x-space) - .125rem);color:var(--sl-color-white)}starlight-file-tree:where(.astro-p67cqifm) .tree-entry{display:inline-flex;align-items:flex-start;flex-wrap:wrap;max-width:calc(100% - 1rem)}@media (min-width: 30em){starlight-file-tree:where(.astro-p67cqifm) .tree-entry{flex-wrap:nowrap}}starlight-file-tree:where(.astro-p67cqifm) .tree-entry>:first-child{flex-shrink:0}starlight-file-tree:where(.astro-p67cqifm) .empty{color:var(--sl-color-gray-3);padding-inline-start:.375rem}starlight-file-tree:where(.astro-p67cqifm) .comment{color:var(--sl-color-gray-3);padding-inline-start:1.625rem;max-width:24rem;min-width:12rem}starlight-file-tree:where(.astro-p67cqifm) .highlight{display:inline-block;border-radius:.25rem;padding-inline-end:.5rem;color:var(--sl-color-text-invert);background-color:var(--sl-color-text-accent)}starlight-file-tree:where(.astro-p67cqifm) svg{display:inline;fill:var(--sl-color-gray-3);vertical-align:middle;margin-inline:.25rem .375rem;width:.875rem;height:.875rem}starlight-file-tree:where(.astro-p67cqifm) .highlight svg.tree-icon{fill:var(--sl-color-text-invert)}
</style><script type="module" src="/_astro/hoisted.B1voUc9X.js"></script>
<script type="module" src="/_astro/page.LS5KDvwX.js"></script></head> <body class="astro-bguv2lll"> <a href="#_top" class="astro-7q3lir66">Skip to content</a> <div class="page sl-flex astro-vrdttmbt"> <header class="header astro-vrdttmbt"><div class="header sl-flex astro-kmkmnagf"> <div class="title-wrapper sl-flex astro-kmkmnagf"> <a href="/" class="site-title sl-flex astro-m46x6ez3"> <img class="astro-m46x6ez3" alt="" src="/_astro/navbar-icon.Bha2ncEb.png" width="1080" height="1080"> <span class="sr-only astro-m46x6ez3"> sern </span> </a> <starlight-select class="md:hidden"><label class="align-center relative ml-4 flex items-center gap-4 text-[var(--sl-color-white)]"><select class="cursor-pointer appearance-none bg-transparent py-2 pe-6 font-semibold text-[var(--sl-color-white)]"><option value="" disabled selected>Menu</option><option value="/v4/reference/getting-started">Docs</option><option value="/plugins">Plugins</option><option value="/sponsors">Sponsors</option><option value="/blog">Blog</option></select><svg aria-hidden="true" class="pointer-events-none absolute end-0 top-1/2 h-6 w-6 -translate-y-1/2 astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label></starlight-select><nav class="hidden items-center gap-4 ps-4 md:flex"><a class="font-semibold text-[var(--sl-color-text-accent)] no-underline" href="/v4/reference/getting-started">Docs</a><a class="font-semibold text-[var(--sl-color-text-accent)] no-underline" href="/plugins">Plugins</a><a class="font-semibold text-[var(--sl-color-text-accent)] no-underline" href="/sponsors">Sponsors</a><a class="font-semibold text-[var(--sl-color-text-accent)] no-underline" href="/blog">Blog</a></nav> </div> <div class="sl-flex astro-kmkmnagf"> <site-search data-translations="{&#34;placeholder&#34;:&#34;Search&#34;}" class="astro-v37mnknz"> <button data-open-modal disabled class="astro-v37mnknz"> <svg aria-label="Search" class="astro-v37mnknz astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21.71 20.29 18 16.61A9 9 0 1 0 16.61 18l3.68 3.68a.999.999 0 0 0 1.42 0 1 1 0 0 0 0-1.39ZM11 18a7 7 0 1 1 0-14 7 7 0 0 1 0 14Z"/></svg> <span class="sl-hidden md:sl-block astro-v37mnknz" aria-hidden="true">Search</span> <svg aria-label="(Press / to Search)" class="sl-hidden md:sl-block astro-v37mnknz astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 2H7a5 5 0 0 0-5 5v10a5 5 0 0 0 5 5h10a5 5 0 0 0 5-5V7a5 5 0 0 0-5-5Zm3 15a3 3 0 0 1-3 3H7a3 3 0 0 1-3-3V7a3 3 0 0 1 3-3h10a3 3 0 0 1 3 3v10Z"/><path d="M15.293 6.707a1 1 0 1 1 1.414 1.414l-8.485 8.486a1 1 0 0 1-1.414-1.415l8.485-8.485Z"/></svg> </button> <dialog style="padding:0" aria-label="Search" class="astro-v37mnknz"> <div class="dialog-frame sl-flex astro-v37mnknz"> <button data-close-modal class="sl-flex md:sl-hidden astro-v37mnknz"> Cancel </button> <div class="search-container astro-v37mnknz"> <div id="starlight__search" class="astro-v37mnknz"></div> </div> </div> </dialog> </site-search> </div> <div class="sl-hidden md:sl-flex right-group astro-kmkmnagf"> <div class="sl-flex social-icons astro-kmkmnagf"> <a href="https://github.com/sern-handler" rel="me" class="sl-flex astro-wy4te6ga"><span class="sr-only astro-wy4te6ga">GitHub</span><svg aria-hidden="true" class="astro-wy4te6ga astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg> </a><a href="https://discord.gg/DwbF5H5JgQ" rel="me" class="sl-flex astro-wy4te6ga"><span class="sr-only astro-wy4te6ga">Discord</span><svg aria-hidden="true" class="astro-wy4te6ga astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M20.32 4.37a19.8 19.8 0 0 0-4.93-1.51 13.78 13.78 0 0 0-.64 1.28 18.27 18.27 0 0 0-5.5 0 12.64 12.64 0 0 0-.64-1.28h-.05A19.74 19.74 0 0 0 3.64 4.4 20.26 20.26 0 0 0 .11 18.09l.02.02a19.9 19.9 0 0 0 6.04 3.03l.04-.02a14.24 14.24 0 0 0 1.23-2.03.08.08 0 0 0-.05-.07 13.1 13.1 0 0 1-1.9-.92.08.08 0 0 1 .02-.1 10.2 10.2 0 0 0 .41-.31h.04a14.2 14.2 0 0 0 12.1 0l.04.01a9.63 9.63 0 0 0 .4.32.08.08 0 0 1-.03.1 12.29 12.29 0 0 1-1.9.91.08.08 0 0 0-.02.1 15.97 15.97 0 0 0 1.27 2.01h.04a19.84 19.84 0 0 0 6.03-3.05v-.03a20.12 20.12 0 0 0-3.57-13.69ZM8.02 15.33c-1.18 0-2.16-1.08-2.16-2.42 0-1.33.96-2.42 2.16-2.42 1.21 0 2.18 1.1 2.16 2.42 0 1.34-.96 2.42-2.16 2.42Zm7.97 0c-1.18 0-2.15-1.08-2.15-2.42 0-1.33.95-2.42 2.15-2.42 1.22 0 2.18 1.1 2.16 2.42 0 1.34-.94 2.42-2.16 2.42Z"/></svg> </a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-4yphtoen"> <span class="sr-only astro-4yphtoen">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select value="auto" class="astro-4yphtoen"> <option value="dark" class="astro-4yphtoen">Dark</option><option value="light" class="astro-4yphtoen">Light</option><option value="auto" selected="true" class="astro-4yphtoen">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
StarlightThemeProvider.updatePickers();
</script> <starlight-lang-select><label style="--sl-select-width: 7em" class="astro-4yphtoen"> <span class="sr-only astro-4yphtoen">Select language</span> <svg aria-hidden="true" class="icon label-icon astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path fill-rule="evenodd" d="M8.516 3a.94.94 0 0 0-.941.94v1.15H2.94a.94.94 0 1 0 0 1.882h7.362a7.422 7.422 0 0 1-1.787 3.958 7.42 7.42 0 0 1-1.422-2.425.94.94 0 1 0-1.774.627 9.303 9.303 0 0 0 1.785 3.043 7.422 7.422 0 0 1-4.164 1.278.94.94 0 1 0 0 1.881 9.303 9.303 0 0 0 5.575-1.855 9.303 9.303 0 0 0 4.11 1.74l-.763 1.525a.968.968 0 0 0-.016.034l-1.385 2.77a.94.94 0 1 0 1.683.841l1.133-2.267h5.806l1.134 2.267a.94.94 0 0 0 1.683-.841l-1.385-2.769a.95.95 0 0 0-.018-.036l-3.476-6.951a.94.94 0 0 0-1.682 0l-1.82 3.639a7.423 7.423 0 0 1-3.593-1.256 9.303 9.303 0 0 0 2.27-5.203h1.894a.94.94 0 0 0 0-1.881H9.456V3.94A.94.94 0 0 0 8.516 3Zm6.426 11.794a1.068 1.068 0 0 1-.02.039l-.703 1.407h3.924l-1.962-3.924-1.24 2.478Z" clip-rule="evenodd"/></svg> <select value="/blog/" class="astro-4yphtoen"> <option value="/blog/" class="astro-4yphtoen">English</option><option value="/es/blog/" class="astro-4yphtoen">Español</option><option value="/tr/blog/" class="astro-4yphtoen">Türkçe</option> </select> <svg aria-hidden="true" class="icon caret astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-lang-select> </div> </div> </header> <nav class="sidebar astro-vrdttmbt" aria-label="Main"> <starlight-menu-button class="astro-jif73yzw"> <button aria-expanded="false" aria-label="Menu" aria-controls="starlight__sidebar" class="sl-flex md:sl-hidden astro-jif73yzw"> <svg aria-hidden="true" class="astro-jif73yzw astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M3 8h18a1 1 0 1 0 0-2H3a1 1 0 0 0 0 2Zm18 8H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Zm0-5H3a1 1 0 0 0 0 2h18a1 1 0 0 0 0-2Z"/></svg> </button> </starlight-menu-button> <div id="starlight__sidebar" class="sidebar-pane astro-vrdttmbt"> <div class="sidebar-content sl-flex astro-vrdttmbt"> <ul class="top-level astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/blog" aria-current="page" class="large astro-3ii7xxms"> <span class="astro-3ii7xxms">All posts</span> </a> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Recent posts</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/blog/railway-deploy" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Deploying sern with Railway</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/new-logo" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">New logo!</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/3.0.0" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Release 3.0.0</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/2.5.0" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Release 2.5.0</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/2.0.0" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Release 2.0.0</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/1.2.0" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">Release 1.2.0</span> </a> </li> </ul> </details> </li><li class="astro-3ii7xxms"> <details open class="astro-3ii7xxms"> <summary class="astro-3ii7xxms"> <div class="group-label astro-3ii7xxms"> <span class="large astro-3ii7xxms">Tags</span> </div> <svg aria-hidden="true" class="caret astro-3ii7xxms astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.25rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </summary> <ul class="astro-3ii7xxms"> <li class="astro-3ii7xxms"> <a href="/blog/tags/release" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">release (4)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/tags/branding" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">branding (1)</span> </a> </li><li class="astro-3ii7xxms"> <a href="/blog/tags/guides" class="astro-3ii7xxms"> <span class="astro-3ii7xxms">guides (1)</span> </a> </li> </ul> </details> </li> </ul> <div class="md:sl-hidden"> <div class="mobile-preferences sl-flex astro-wu23bvmt"> <div class="sl-flex social-icons astro-wu23bvmt"> <a href="https://github.com/sern-handler" rel="me" class="sl-flex astro-wy4te6ga"><span class="sr-only astro-wy4te6ga">GitHub</span><svg aria-hidden="true" class="astro-wy4te6ga astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M12 .3a12 12 0 0 0-3.8 23.38c.6.12.83-.26.83-.57L9 21.07c-3.34.72-4.04-1.61-4.04-1.61-.55-1.39-1.34-1.76-1.34-1.76-1.08-.74.09-.73.09-.73 1.2.09 1.83 1.24 1.83 1.24 1.08 1.83 2.81 1.3 3.5 1 .1-.78.42-1.31.76-1.61-2.67-.3-5.47-1.33-5.47-5.93 0-1.31.47-2.38 1.24-3.22-.14-.3-.54-1.52.1-3.18 0 0 1-.32 3.3 1.23a11.5 11.5 0 0 1 6 0c2.28-1.55 3.29-1.23 3.29-1.23.64 1.66.24 2.88.12 3.18a4.65 4.65 0 0 1 1.23 3.22c0 4.61-2.8 5.63-5.48 5.92.42.36.81 1.1.81 2.22l-.01 3.29c0 .31.2.69.82.57A12 12 0 0 0 12 .3Z"/></svg> </a><a href="https://discord.gg/DwbF5H5JgQ" rel="me" class="sl-flex astro-wy4te6ga"><span class="sr-only astro-wy4te6ga">Discord</span><svg aria-hidden="true" class="astro-wy4te6ga astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M20.32 4.37a19.8 19.8 0 0 0-4.93-1.51 13.78 13.78 0 0 0-.64 1.28 18.27 18.27 0 0 0-5.5 0 12.64 12.64 0 0 0-.64-1.28h-.05A19.74 19.74 0 0 0 3.64 4.4 20.26 20.26 0 0 0 .11 18.09l.02.02a19.9 19.9 0 0 0 6.04 3.03l.04-.02a14.24 14.24 0 0 0 1.23-2.03.08.08 0 0 0-.05-.07 13.1 13.1 0 0 1-1.9-.92.08.08 0 0 1 .02-.1 10.2 10.2 0 0 0 .41-.31h.04a14.2 14.2 0 0 0 12.1 0l.04.01a9.63 9.63 0 0 0 .4.32.08.08 0 0 1-.03.1 12.29 12.29 0 0 1-1.9.91.08.08 0 0 0-.02.1 15.97 15.97 0 0 0 1.27 2.01h.04a19.84 19.84 0 0 0 6.03-3.05v-.03a20.12 20.12 0 0 0-3.57-13.69ZM8.02 15.33c-1.18 0-2.16-1.08-2.16-2.42 0-1.33.96-2.42 2.16-2.42 1.21 0 2.18 1.1 2.16 2.42 0 1.34-.96 2.42-2.16 2.42Zm7.97 0c-1.18 0-2.15-1.08-2.15-2.42 0-1.33.95-2.42 2.15-2.42 1.22 0 2.18 1.1 2.16 2.42 0 1.34-.94 2.42-2.16 2.42Z"/></svg> </a> </div> <starlight-theme-select> <label style="--sl-select-width: 6.25em" class="astro-4yphtoen"> <span class="sr-only astro-4yphtoen">Select theme</span> <svg aria-hidden="true" class="icon label-icon astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M21 14h-1V7a3 3 0 0 0-3-3H7a3 3 0 0 0-3 3v7H3a1 1 0 0 0-1 1v2a3 3 0 0 0 3 3h14a3 3 0 0 0 3-3v-2a1 1 0 0 0-1-1ZM6 7a1 1 0 0 1 1-1h10a1 1 0 0 1 1 1v7H6V7Zm14 10a1 1 0 0 1-1 1H5a1 1 0 0 1-1-1v-1h16v1Z"/></svg> <select value="auto" class="astro-4yphtoen"> <option value="dark" class="astro-4yphtoen">Dark</option><option value="light" class="astro-4yphtoen">Light</option><option value="auto" selected="true" class="astro-4yphtoen">Auto</option> </select> <svg aria-hidden="true" class="icon caret astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-theme-select> <script>
StarlightThemeProvider.updatePickers();
</script> <starlight-lang-select><label style="--sl-select-width: 7em" class="astro-4yphtoen"> <span class="sr-only astro-4yphtoen">Select language</span> <svg aria-hidden="true" class="icon label-icon astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path fill-rule="evenodd" d="M8.516 3a.94.94 0 0 0-.941.94v1.15H2.94a.94.94 0 1 0 0 1.882h7.362a7.422 7.422 0 0 1-1.787 3.958 7.42 7.42 0 0 1-1.422-2.425.94.94 0 1 0-1.774.627 9.303 9.303 0 0 0 1.785 3.043 7.422 7.422 0 0 1-4.164 1.278.94.94 0 1 0 0 1.881 9.303 9.303 0 0 0 5.575-1.855 9.303 9.303 0 0 0 4.11 1.74l-.763 1.525a.968.968 0 0 0-.016.034l-1.385 2.77a.94.94 0 1 0 1.683.841l1.133-2.267h5.806l1.134 2.267a.94.94 0 0 0 1.683-.841l-1.385-2.769a.95.95 0 0 0-.018-.036l-3.476-6.951a.94.94 0 0 0-1.682 0l-1.82 3.639a7.423 7.423 0 0 1-3.593-1.256 9.303 9.303 0 0 0 2.27-5.203h1.894a.94.94 0 0 0 0-1.881H9.456V3.94A.94.94 0 0 0 8.516 3Zm6.426 11.794a1.068 1.068 0 0 1-.02.039l-.703 1.407h3.924l-1.962-3.924-1.24 2.478Z" clip-rule="evenodd"/></svg> <select value="/blog/" class="astro-4yphtoen"> <option value="/blog/" class="astro-4yphtoen">English</option><option value="/es/blog/" class="astro-4yphtoen">Español</option><option value="/tr/blog/" class="astro-4yphtoen">Türkçe</option> </select> <svg aria-hidden="true" class="icon caret astro-4yphtoen astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1em;"><path d="M17 9.17a1 1 0 0 0-1.41 0L12 12.71 8.46 9.17a1 1 0 1 0-1.41 1.42l4.24 4.24a1.002 1.002 0 0 0 1.42 0L17 10.59a1.002 1.002 0 0 0 0-1.42Z"/></svg> </label> </starlight-lang-select> </div> </div> </div> </div> </nav> <div class="main-frame astro-vrdttmbt"> <div class="lg:sl-flex astro-67yu43on"> <aside class="right-sidebar-container astro-67yu43on"> <div class="right-sidebar astro-67yu43on"> <div class="lg:sl-hidden astro-pb3aqygn"><mobile-starlight-toc data-min-h="2" data-max-h="3" class="astro-doynk5tl"><nav aria-labelledby="starlight__on-this-page--mobile" class="astro-doynk5tl"><details id="starlight__mobile-toc" class="astro-doynk5tl"><summary id="starlight__on-this-page--mobile" class="sl-flex astro-doynk5tl"><div class="toggle sl-flex astro-doynk5tl">On this page<svg aria-hidden="true" class="caret astro-doynk5tl astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1rem;"><path d="m14.83 11.29-4.24-4.24a1 1 0 1 0-1.42 1.41L12.71 12l-3.54 3.54a1 1 0 0 0 0 1.41 1 1 0 0 0 .71.29 1 1 0 0 0 .71-.29l4.24-4.24a1.002 1.002 0 0 0 0-1.42Z"/></svg> </div><span class="display-current astro-doynk5tl"></span></summary><div class="dropdown astro-doynk5tl"><ul class="isMobile astro-g2bywc46" style="--depth: 0;"> <li class="astro-g2bywc46" style="--depth: 0;"> <a href="#_top" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Overview</span> </a> </li> </ul> </div></details></nav></mobile-starlight-toc></div><div class="right-sidebar-panel sl-hidden lg:sl-block astro-pb3aqygn"><div class="sl-container astro-pb3aqygn"><starlight-toc data-min-h="2" data-max-h="3"><nav aria-labelledby="starlight__on-this-page"><h2 id="starlight__on-this-page">On this page</h2><ul class="astro-g2bywc46" style="--depth: 0;"> <li class="astro-g2bywc46" style="--depth: 0;"> <a href="#_top" class="astro-g2bywc46" style="--depth: 0;"> <span class="astro-g2bywc46" style="--depth: 0;">Overview</span> </a> </li> </ul> </nav></starlight-toc></div></div> </div> </aside> <div class="main-pane astro-67yu43on"> <main lang="en" dir="ltr" class="astro-bguv2lll"> <div class="content-panel astro-7nkwcw3z"> <div class="sl-container astro-7nkwcw3z"> <h1 id="_top" class="astro-j6tvhyss">Blog</h1> </div> </div> <div class="content-panel astro-7nkwcw3z"> <div class="sl-container astro-7nkwcw3z"> <div class="sl-markdown-content"> <div class="posts astro-xaz7kpyh"> <article class="preview astro-dr56dw7m"> <header class="astro-dr56dw7m"> <h2 class="astro-dr56dw7m"> <a href="/blog/railway-deploy" class="astro-dr56dw7m">Deploying sern with Railway</a> </h2> <div class="metadata not-content astro-2oxtfctb"> <time datetime="2024-02-23T00:00:00.000Z" class="astro-2oxtfctb"> Feb 23, 2024 </time> <div class="authors astro-2oxtfctb"> <a href="https://github.com/DuroCodes" class="author astro-kbhsbk7c"><img alt="Duro" src="https://github.com/DuroCodes.png" class="astro-kbhsbk7c"><div class="text astro-kbhsbk7c"> <div class="name astro-kbhsbk7c">Duro</div> <div class="title astro-kbhsbk7c">Developer</div> </div> </a> </div> </div> </header> <div class="sl-markdown-content astro-dr56dw7m"> <p>In this guide, Ill be showing you how to deploy your sern bot with <a href="https://railway.app/">Railway</a>.</p>
<p>This guide assumes you have a sern bot already set up and ready to deploy. If you dont, you can follow the <a href="/v3/guide/walkthrough/new-project">walkthrough</a> to set up your bot.</p>
<h2 id="github-repository">GitHub Repository</h2>
<p>The first thing youll need to deploy your bot is a GitHub repository for your bot. If you dont have one, you can create one by following the <a href="https://docs.github.com/en/get-started/quickstart/create-a-repo">GitHub guide</a>.</p>
<p>Once you have your repository set up, you can push your bots code to the repository, and youre ready to deploy using Railway.</p>
<h2 id="railway-setup">Railway Setup</h2>
<p>After you have your bots code in a GitHub repository, youll need to create an account on Railway. You can sign up using your GitHub account at <a href="https://railway.app/">railway.app</a>.</p>
<p>Once youve created your account, navigate to the <a href="https://railway.app/dashboard">dashboard</a> and click the “New Project” button. Click the “Deploy from GitHub repo” button, and select your bots repository.</p>
<p>Once youve selected your repository, click the “Add Variables” button to add your bots environment variables. Youll need your environment variables from your <code dir="auto">.env</code> file to add to Railway. (You can also add these later if you want.)</p>
<h2 id="deploy">Deploy</h2>
<p>Once youve added your environment variables, click the “Deploy” button, and Railway will start deploying your bot. Once the deployment is complete, youll be able to see your bots URL and logs.</p>
<aside aria-label="Note" class="starlight-aside starlight-aside--note"><p class="starlight-aside__title" aria-hidden="true"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" class="starlight-aside__icon"><path d="M12 11C11.7348 11 11.4804 11.1054 11.2929 11.2929C11.1054 11.4804 11 11.7348 11 12V16C11 16.2652 11.1054 16.5196 11.2929 16.7071C11.4804 16.8946 11.7348 17 12 17C12.2652 17 12.5196 16.8946 12.7071 16.7071C12.8946 16.5196 13 16.2652 13 16V12C13 11.7348 12.8946 11.4804 12.7071 11.2929C12.5196 11.1054 12.2652 11 12 11ZM12.38 7.08C12.1365 6.97998 11.8635 6.97998 11.62 7.08C11.4973 7.12759 11.3851 7.19896 11.29 7.29C11.2017 7.3872 11.1306 7.49882 11.08 7.62C11.024 7.73868 10.9966 7.86882 11 8C10.9992 8.13161 11.0245 8.26207 11.0742 8.38391C11.124 8.50574 11.1973 8.61656 11.29 8.71C11.3872 8.79833 11.4988 8.86936 11.62 8.92C11.7715 8.98224 11.936 9.00632 12.099 8.99011C12.2619 8.97391 12.4184 8.91792 12.5547 8.82707C12.691 8.73622 12.8029 8.61328 12.8805 8.46907C12.9582 8.32486 12.9992 8.16378 13 8C12.9963 7.73523 12.8927 7.48163 12.71 7.29C12.6149 7.19896 12.5028 7.12759 12.38 7.08ZM12 2C10.0222 2 8.08879 2.58649 6.4443 3.6853C4.79981 4.78412 3.51809 6.3459 2.76121 8.17317C2.00433 10.0004 1.8063 12.0111 2.19215 13.9509C2.578 15.8907 3.53041 17.6725 4.92894 19.0711C6.32746 20.4696 8.10929 21.422 10.0491 21.8079C11.9889 22.1937 13.9996 21.9957 15.8268 21.2388C17.6541 20.4819 19.2159 19.2002 20.3147 17.5557C21.4135 15.9112 22 13.9778 22 12C22 10.6868 21.7413 9.38642 21.2388 8.17317C20.7363 6.95991 19.9997 5.85752 19.0711 4.92893C18.1425 4.00035 17.0401 3.26375 15.8268 2.7612C14.6136 2.25866 13.3132 2 12 2ZM12 20C10.4178 20 8.87104 19.5308 7.55544 18.6518C6.23985 17.7727 5.21447 16.5233 4.60897 15.0615C4.00347 13.5997 3.84504 11.9911 4.15372 10.4393C4.4624 8.88743 5.22433 7.46197 6.34315 6.34315C7.46197 5.22433 8.88743 4.4624 10.4393 4.15372C11.9911 3.84504 13.5997 4.00346 15.0615 4.60896C16.5233 5.21447 17.7727 6.23984 18.6518 7.55544C19.5308 8.87103 20 10.4177 20 12C20 14.1217 19.1572 16.1566 17.6569 17.6569C16.1566 19.1571 14.1217 20 12 20Z"></path></svg>Note</p><section class="starlight-aside__content"><p>Make sure you add your environment variables, and your node start script is correct in your <code dir="auto">package.json</code> file.</p><p>If you have any issues deploying your bot, you can check the logs for any errors.</p></section></aside>
<p>Thats it! Your bot is now deployed and running on Railway. If you have any issues or questions, feel free to ask in the <a href="https://sern.dev/discord">sern Discord server</a>.</p> </div> <footer class="astro-dr56dw7m"> <div class="astro-sg3lsd66"><b class="astro-sg3lsd66">Tags: </b><ul class="astro-sg3lsd66"><li class="astro-sg3lsd66"><a href="/blog/tags/guides" class="astro-sg3lsd66">guides</a></li></ul></div> </footer> </article> <article class="preview astro-dr56dw7m"> <header class="astro-dr56dw7m"> <h2 class="astro-dr56dw7m"> <a href="/blog/new-logo" class="astro-dr56dw7m">New logo!</a> </h2> <div class="metadata not-content astro-2oxtfctb"> <time datetime="2023-07-04T00:00:00.000Z" class="astro-2oxtfctb"> Jul 4, 2023 </time> <div class="authors astro-2oxtfctb"> <a href="https://github.com/sern-handler" class="author astro-kbhsbk7c"><img alt="sern Team" src="https://github.com/sernbot.png" class="astro-kbhsbk7c"><div class="text astro-kbhsbk7c"> <div class="name astro-kbhsbk7c">sern Team</div> </div> </a> </div> </div> </header> <div class="sl-markdown-content astro-dr56dw7m"> <p>Hey everyone! Today we have very special news for you all: Were changing our logo!</p>
<h1 id="why">Why?</h1>
<p>You see, on todays standards, having a simple logo is essential. Our logo aligns perfectly with these design principles but it can always be improved.<br>
We were chilling, you know, cooking sern handler v3, sern gui, <code dir="auto">npm create @sern/bot</code> and serncord when we thought about changing the logo to a sleek design with less colors.<br>
And here we are!</p>
<h1 id="who-did-our-new-branding">Who did our new branding?</h1>
<p><a href="https://github.com/Murtatrxx">Ropox</a>!</p>
<p>Bros the GOAT. This website is maintained by him, the domain costs are funded by him and also he started brainstorming how the logo would be on paper:<br>
<img src="/_astro/paper-prototypes.BdO1dlBa_2tHrwb.webp" alt="paper prototypes" width="4032" height="3024" loading="lazy" decoding="async"></p>
<p>And there it all clicked:<br>
<img src="/_astro/paper-logo.CrJ9mAsn_26BAXS.webp" alt="paper logo" width="830" height="455" loading="lazy" decoding="async"></p>
<p>seren tried by the way!
<img src="/_astro/seren-tried.Bwq_sMDf_Z28fkDq.webp" alt="seren tried" width="908" height="509" loading="lazy" decoding="async"></p>
<h1 id="anyways-here-it-is">Anyways, here it is:</h1>
<p><img src="/_astro/sern-logo.DrMjwPpH_eN2QN.webp" alt="sern logo" width="2160" height="2160" loading="lazy" decoding="async"></p>
<p>Pretty nice!</p>
<p>By the way, we have animations and variations on the way, so make sure to stay updated in the <a href="https://sern.dev/discord">discord server</a>!</p>
<h1 id="finally-from-the-entire-sern-team-thank-you-for-sticking-around-">Finally, from the entire sern team, thank you for sticking around ❤️</h1> </div> <footer class="astro-dr56dw7m"> <div class="astro-sg3lsd66"><b class="astro-sg3lsd66">Tags: </b><ul class="astro-sg3lsd66"><li class="astro-sg3lsd66"><a href="/blog/tags/branding" class="astro-sg3lsd66">branding</a></li></ul></div> </footer> </article> <article class="preview astro-dr56dw7m"> <header class="astro-dr56dw7m"> <h2 class="astro-dr56dw7m"> <a href="/blog/3.0.0" class="astro-dr56dw7m">Release 3.0.0</a> </h2> <div class="metadata not-content astro-2oxtfctb"> <time datetime="2023-06-18T00:00:00.000Z" class="astro-2oxtfctb"> Jun 18, 2023 </time> <div class="authors astro-2oxtfctb"> <a href="https://github.com/jacoobes" class="author astro-kbhsbk7c"><img alt="jacoobes" src="https://github.com/jacoobes.png" class="astro-kbhsbk7c"><div class="text astro-kbhsbk7c"> <div class="name astro-kbhsbk7c">jacoobes</div> <div class="title astro-kbhsbk7c">Head Dev</div> </div> </a> </div> </div> </header> <div class="sl-markdown-content astro-dr56dw7m"> <h2 id="30-release">3.0 Release</h2>
<h3 id="join-our-discord">Join our <a href="https://sern.dev/discord">discord</a> <br></h3>
<h3 id="features">Features</h3>
<h4 id="dependency-management">Dependency Management</h4>
<ul>
<li><code dir="auto">Service</code> API (recommended to use this over useContainer hooks)
<ul>
<li>Dependencies type must be globally augmented in order for Services api to function properly</li>
</ul>
</li>
<li>new methods on ModuleManager
<ul>
<li>getPublishableCommands()</li>
</ul>
</li>
<li>Init Hooks
<ul>
<li>implement starting behavior for dependencies</li>
<li>To enforce and type check this, use the <code dir="auto">Initializable</code> type when making your Dependencies type!</li>
</ul>
</li>
<li>Emitter interface
<ul>
<li>More generic interface to define any event emitter</li>
<li>You can now swap out the SernEmitter with whatever emitter now.</li>
</ul>
</li>
</ul>
<div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.nhq3f.css"><script type="module" src="/_astro/ec.3zb7u.js"></script><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">class</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">DatabaseService</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">implements</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#3C63B3">Init</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"> </span><span style="--0:#809191;--1:#5E6578">//some hypothetical database</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">_pgsql </span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--1:#111111"><span style="--0:#FFCB8B">database</span><span style="--0:#D9F5DD">()</span></span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code">
</div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">async</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">init</span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">await</span><span style="--0:#D6DEEB;--1:#403F53"> _pgsql</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">load</span><span style="--0:#D6DEEB;--1:#403F53">()</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">8</div></div><div class="code">
</div></div><div class="ec-line"><div class="gutter"><div class="ln">9</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">10</div></div><div class="code">
</div></div><div class="ec-line"><div class="gutter"><div class="ln">11</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">await</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">makeDependencies</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">12</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">build</span><span style="--1:#403F53"><span style="--0:#D6DEEB">: </span><span style="--0:#D7DBE0">root</span><span style="--0:#D6DEEB"> </span></span><span style="--0:#C792EA;--1:#8D46B4">=></span><span style="--0:#D6DEEB;--1:#403F53"> root</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">add</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">13</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">db: </span><span style="--0:#7FDBCA;--1:#097174">new</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">DatabaseService</span><span style="--0:#D6DEEB;--1:#403F53">() </span><span style="--0:#809191;--1:#5E6578">//will be init'ed automatically</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">14</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">})</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">15</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">})</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="class DatabaseService implements Init { //some hypothetical database _pgsql : database() async init() { await _pgsql.load() }}await makeDependencies({ build: root => root.add({ db: new DatabaseService() //will be init&#x27;ed automatically })})"><div></div></button></div></figure></div>
<ul>
<li>new SernEmitter event <code dir="auto">modulesLoaded</code> , which allows users to customize behavior after all modules are loaded!</li>
</ul>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">default</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">eventModule</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">name: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">modulesLoaded</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">type: EventType</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#7FDBCA;--1:#097174">Sern</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">execute</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">=></span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">console</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">log</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">All modules loaded</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">},</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">});</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="export default eventModule({ name: &#x22;modulesLoaded&#x22;, type: EventType.Sern, execute: () => { console.log(&#x22;All modules loaded&#x22;); },});"><div></div></button></div></figure></div>
<h4 id="quality-of-life">Quality of Life</h4>
<ul>
<li>
<p>faster module loading</p>
<ul>
<li>I utilize async generators for reading files now. A lot faster than the first iteration.</li>
</ul>
</li>
<li>
<p>better error handling</p>
</li>
<li>
<p>Less boilerplate</p>
<ul>
<li>Services api cleans up v2 boilerplate</li>
</ul>
</li>
<li>
<p>class modules devex got upgraded and work better than before</p>
</li>
<li>
<p>automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)</p>
<ul>
<li>ignore commands and events with <code dir="auto">!</code> prefix on filename or directory (ie: <code dir="auto">!filename.ts</code> or <code dir="auto">!directory</code> will be ignored by sern)</li>
</ul>
</li>
<li>
<p><code dir="auto">Service</code> API (recommended to use this over useContainer hooks)</p>
<ul>
<li>Dependencies type must be globally augmented in order for Services api to function properly</li>
</ul>
</li>
<li>
<p>Less boilerplate</p>
</li>
<li>
<p>new methods on ModuleManager</p>
</li>
<li>
<p>automatically ignore any files not ending in (mts, cts, mjs, cjs, ts, js)</p>
<ul>
<li>ignore commands / events with <code dir="auto">!</code> prefix on filename or directory (ie: <code dir="auto">!filename.ts</code> or <code dir="auto">!directory</code>)</li>
</ul>
</li>
<li>
<p>new SernEmitter event <code dir="auto">modulesLoaded</code> , which allows users to customize behavior after all modules are loaded!</p>
</li>
<li>
<p>Init Hooks</p>
<ul>
<li>implement starting behavior for dependencies</li>
</ul>
</li>
</ul>
<h3 id="experimental">Experimental</h3>
<ul>
<li>Experimental things may be subject to removal, need feedback and are not guaranteed stable</li>
<li>dev / prod mode
<ul>
<li>sern will behave differently depending on mode set</li>
</ul>
</li>
<li>init sern from <code dir="auto">file</code> option
<ul>
<li>reads from local sern.config.json</li>
</ul>
</li>
</ul>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="js"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#7FDBCA;--1:#097174">Sern</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">init</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">file</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="Sern.init(&#x22;file&#x22;);"><div></div></button></div></figure></div>
<h3 id="breaking-changes">Breaking changes</h3>
<ul>
<li>Sern.makeDependencies -> makeDependencies
<ul>
<li>it is asynchronous and top level function now. Make sure to await it before initing for proper synchronization.</li>
</ul>
</li>
<li>module store and manager internally changed, so those using them may recieve breaking changes</li>
<li>BaseOptions type removed</li>
</ul>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line highlight del"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">Sern</span><span style="--0:#c995eb;--1:#6a3587">.</span><span style="--0:#82AAFF;--1:#2d4a86">makeDependencies</span><span style="--0:#D6DEEB;--1:#403F53">({ </span><span style="--0:#82AAFF;--1:#2d4a86">build</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#c995eb;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> {} })</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">await</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#86adff;--1:#2e4c89">makeDependencies</span><span style="--0:#D6DEEB;--1:#403F53">({ </span><span style="--0:#86adff;--1:#2e4c89">build</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> {} })</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="Sern.makeDependencies({ build: () => {} })await makeDependencies({ build: () => {} })"><div></div></button></div></figure></div>
<h3 id="deprecations">Deprecations</h3>
<ul>
<li>Removed all previous marked deprecations in v3</li>
<li>ModuleStore will be removed as a dependency in v4. The only way to access modules should be through ModuleManager</li>
<li>Default Dependencies will be made internal in the v4. Users should only have access to its interface / contract</li>
</ul> </div> <footer class="astro-dr56dw7m"> <div class="astro-sg3lsd66"><b class="astro-sg3lsd66">Tags: </b><ul class="astro-sg3lsd66"><li class="astro-sg3lsd66"><a href="/blog/tags/release" class="astro-sg3lsd66">release</a></li></ul></div> </footer> </article> <article class="preview astro-dr56dw7m"> <header class="astro-dr56dw7m"> <h2 class="astro-dr56dw7m"> <a href="/blog/2.5.0" class="astro-dr56dw7m">Release 2.5.0</a> </h2> <div class="metadata not-content astro-2oxtfctb"> <time datetime="2023-01-12T00:00:00.000Z" class="astro-2oxtfctb"> Jan 12, 2023 </time> <div class="authors astro-2oxtfctb"> <a href="https://github.com/jacoobes" class="author astro-kbhsbk7c"><img alt="jacoobes" src="https://github.com/jacoobes.png" class="astro-kbhsbk7c"><div class="text astro-kbhsbk7c"> <div class="name astro-kbhsbk7c">jacoobes</div> <div class="title astro-kbhsbk7c">Head Dev</div> </div> </a> </div> </div> </header> <div class="sl-markdown-content astro-dr56dw7m"> <h2 id="25-release">2.5 Release</h2>
<h3 id="join-our-discord">Join our <a href="https://sern.dev/discord">discord</a> <br></h3>
<ul>
<li>Thank you for using sern in your projects. Its only going to get better!</li>
<li>I apologize for the sudden small breaking change. After this update, there wont be any for a while.
Wow! Were increasing our semantic versioning by <code dir="auto">+0.3.9</code> <br>
What does this mean?</li>
</ul>
<h3 id="breaking-changes">Breaking changes</h3>
<ul>
<li><code dir="auto">controller</code> parameter for plugins has been removed
<ul>
<li>Youll need to import it instead</li>
<li>This <strong>breaks</strong> old <code dir="auto">CommandPlugin</code>, but <strong>not</strong> old <code dir="auto">EventPlugin</code></li>
</ul>
</li>
</ul>
<h3 id="deprecations">Deprecations</h3>
<ul>
<li><code dir="auto">CommandPlugin</code> and <code dir="auto">EventPlugin</code> have been renamed to <a href="/v3/api/interfaces/initplugin">InitPlugin</a> and <a href="/v3/api/interfaces/controlplugin">ControlPlugin</a>, respectively</li>
</ul>
<h3 id="reason">Reason</h3>
<ul>
<li>The naming of plugins was getting too complex. For example, plugin naming evolved into CommandModuleCommandPlugin, CommandModuleEventPlugin and more.</li>
<li>I realize that this affects all plugins. I have updated all <a href="https://github.com/sern-handler/awesome-plugins/pull/68">plugins</a> to match these changes</li>
<li>The old way of declaring plugins has been deprecated in favor of newer functions that facilitate and ease typings
<ul>
<li><a href="/v3/api/functions/commandcontrolplugin">CommandControlPlugin</a></li>
<li><a href="/v3/api/functions/commandinitplugin">CommandInitPlugin</a></li>
<li><a href="/v3/api/functions/eventcontrolplugin">EventControlPlugin</a></li>
<li><a href="/v3/api/functions/eventinitplugin">EventInitPlugin</a></li>
<li><a href="/v3/api/functions/discordeventcontrolplugin">DiscordEventControlPlugin</a></li>
</ul>
</li>
</ul>
<p>This will probably be the last breaking change in a while. Thanks for using sern!</p> </div> <footer class="astro-dr56dw7m"> <div class="astro-sg3lsd66"><b class="astro-sg3lsd66">Tags: </b><ul class="astro-sg3lsd66"><li class="astro-sg3lsd66"><a href="/blog/tags/release" class="astro-sg3lsd66">release</a></li></ul></div> </footer> </article> <article class="preview astro-dr56dw7m"> <header class="astro-dr56dw7m"> <h2 class="astro-dr56dw7m"> <a href="/blog/2.0.0" class="astro-dr56dw7m">Release 2.0.0</a> </h2> <div class="metadata not-content astro-2oxtfctb"> <time datetime="2022-12-13T00:00:00.000Z" class="astro-2oxtfctb"> Dec 13, 2022 </time> <div class="authors astro-2oxtfctb"> <a href="https://github.com/jacoobes" class="author astro-kbhsbk7c"><img alt="jacoobes" src="https://github.com/jacoobes.png" class="astro-kbhsbk7c"><div class="text astro-kbhsbk7c"> <div class="name astro-kbhsbk7c">jacoobes</div> <div class="title astro-kbhsbk7c">Head Dev</div> </div> </a> </div> </div> </header> <div class="sl-markdown-content astro-dr56dw7m"> <h2 id="20-release">2.0 Release</h2>
<p>Join our <a href="https://sern.dev/discord">discord</a>! <br>
Wow! Were finally increasing our semantic versioning by +<code dir="auto">1.7.9.</code> <br>
What does this mean?</p>
<h3 id="plugin-support-for-event-modules">Plugin Support for Event Modules</h3>
<p>You can now use plugins for event modules. Previous version would throw an error if the
<code dir="auto">plugins</code> field was populated.</p>
<div class="expressive-code"><link rel="stylesheet" href="/_astro/ec.nhq3f.css"><script type="module" src="/_astro/ec.3zb7u.js"></script><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="typescript"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">function</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">commandPlTest</span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">SernEmitterPlugin</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">return</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">type: PluginType</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#7FDBCA;--1:#097174">Command</span><span style="--0:#7690A6;--1:#4F687D">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">execute</span><span style="--0:#D6DEEB;--1:#403F53">: </span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--1:#403F53"><span style="--0:#D6DEEB">{ </span><span style="--0:#D7DBE0">mod</span><span style="--0:#D6DEEB"> }, </span><span style="--0:#D7DBE0">controller</span></span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">=></span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">if</span><span style="--0:#D6DEEB;--1:#403F53"> (mod</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#7FDBCA;--1:#097174">name</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">===</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">module.register</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">) {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">console</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">log</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">Event Module created correctly</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">return</span><span style="--0:#D6DEEB;--1:#403F53"> controller</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">next</span><span style="--0:#D6DEEB;--1:#403F53">();</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">8</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">9</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">console</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">log</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">event name is wrong</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">10</div></div><div class="code"><span class="indent"> </span><span style="--0:#C792EA;--1:#8D46B4">return</span><span style="--0:#D6DEEB;--1:#403F53"> controller</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">stop</span><span style="--0:#D6DEEB;--1:#403F53">();</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">11</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">}</span><span style="--0:#7690A6;--1:#4F687D">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">12</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">};</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">13</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="export function commandPlTest(): SernEmitterPlugin { return { type: PluginType.Command, execute: ({ mod }, controller) => { if (mod.name === &#x22;module.register&#x22;) { console.log(&#x22;Event Module created correctly&#x22;); return controller.next(); } console.log(&#x22;event name is wrong&#x22;); return controller.stop(); }, };}"><div></div></button></div></figure></div>
<p>Applying this plugin to some <code dir="auto">eventModule</code>:</p>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="typescript"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">default</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">eventModule</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">name: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">error</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">type: EventType</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#7FDBCA;--1:#097174">Sern</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">plugins: [</span><span style="--0:#82AAFF;--1:#3C63B3">commandPlTest</span><span style="--0:#D6DEEB;--1:#403F53">()],</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">execute</span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--0:#D7DBE0;--1:#403F53">m</span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">console</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">log</span><span style="--0:#D6DEEB;--1:#403F53">(m);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">},</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">8</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">});</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="export default eventModule({ name: &#x22;error&#x22;, type: EventType.Sern, plugins: [commandPlTest()], execute(m) { console.log(m); },});"><div></div></button></div></figure></div>
<h2 id="dependency-injection-and-decoupling">Dependency Injection and Decoupling</h2>
<p>The powerful npm package <code dir="auto">iti</code> decouples sern even more.
Decoupling data structures with the Inversion of Control pattern separates data from logic, which will help speed production
and make sern even more customizable than before.</p>
<h3 id="how-do-i-start">How do I start?</h3>
<div class="expressive-code"><figure class="frame has-title not-content"><figcaption class="header"><span class="title">src/index.ts</span></figcaption><pre data-language="typescript"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#809191;--1:#5E6578">//With typescript, you can customize / augment your typings.</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">interface</span><span style="--0:#D6DEEB;--1:#403F53"> MyDependencies </span><span style="--0:#C792EA;--1:#8D46B4">extends</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#3C63B3">Dependencies</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/client</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">Client</span><span style="--0:#D6DEEB;--1:#403F53">>;</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/logger</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">DefaultLogging</span><span style="--0:#D6DEEB;--1:#403F53">>;</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code">
</div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export const </span><span style="--0:#82AAFF;--1:#3C63B3">useContainer</span><span style="--0:#C792EA;--1:#8D46B4"> = </span><span style="--0:#D6DEEB;--1:#403F53">Sern</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">makeDependencies</span><span style="--0:#C792EA;--1:#8D46B4">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">MyDependencies</span><span style="--0:#C792EA;--1:#8D46B4">></span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#C792EA;--1:#8D46B4">{</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">8</div></div><div class="code"><span class="indent"> </span><span style="--0:#809191;--1:#5E6578">// exclude: new Set(['@sern/logger']), don't autofill optional dependencies</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">9</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">build</span><span style="--0:#C792EA;--1:#8D46B4">: </span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--0:#D7DBE0;--1:#403F53">root</span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#C792EA;--1:#8D46B4"> =></span></div></div><div class="ec-line"><div class="gutter"><div class="ln">10</div></div><div class="code"><span class="indent"> </span><span style="--0:#D6DEEB;--1:#403F53">root</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">11</div></div><div class="code"><span class="indent"><span style="--0:#C792EA;--1:#8D46B4"> </span></span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">add</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#C792EA;--1:#8D46B4">{ </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/client</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C792EA;--1:#8D46B4">: </span><span style="--0:#82AAFF;--1:#3C63B3">single</span><span style="--0:#D6DEEB;--1:#403F53">(client)</span><span style="--0:#C792EA;--1:#8D46B4"> }</span><span style="--0:#D6DEEB;--1:#403F53">)</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">12</div></div><div class="code"><span class="indent"><span style="--0:#C792EA;--1:#8D46B4"> </span></span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">add</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#C792EA;--1:#8D46B4">{ </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/logger</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#C792EA;--1:#8D46B4">: </span><span style="--0:#82AAFF;--1:#3C63B3">single</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#7FDBCA;--1:#097174">new</span><span style="--0:#C792EA;--1:#8D46B4"> </span><span style="--0:#82AAFF;--1:#3C63B3">DefaultLogging</span><span style="--0:#D6DEEB;--1:#403F53">())</span><span style="--0:#C792EA;--1:#8D46B4"> }</span><span style="--0:#D6DEEB;--1:#403F53">)</span><span style="--0:#C792EA;--1:#8D46B4">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">13</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">}</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">14</div></div><div class="code">
</div></div><div class="ec-line"><div class="gutter"><div class="ln">15</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">Sern</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">init</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">16</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">defaultPrefix: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">!</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">, </span><span style="--0:#809191;--1:#5E6578">// removing defaultPrefix will shut down text commands</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">17</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">commands: </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">src/commands</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">18</div></div><div class="code"><span class="indent"> </span><span style="--0:#809191;--1:#5E6578">// events: 'src/events' (optional),</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">19</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">containerConfig: {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">20</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">get: useContainer, </span><span style="--0:#809191;--1:#5E6578">//pass in your dependency getter here</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">21</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">},</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">22</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">});</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="//With typescript, you can customize / augment your typings.interface MyDependencies extends Dependencies { &#x22;@sern/client&#x22;: Singleton<Client>; &#x22;@sern/logger&#x22;: Singleton<DefaultLogging>;}export const useContainer = Sern.makeDependencies<MyDependencies>({ // exclude: new Set([&#x27;@sern/logger&#x27;]), don&#x27;t autofill optional dependencies build: (root) => root .add({ &#x22;@sern/client&#x22;: single(client) }) .add({ &#x22;@sern/logger&#x22;: single(new DefaultLogging()) }),});Sern.init({ defaultPrefix: &#x22;!&#x22;, // removing defaultPrefix will shut down text commands commands: &#x22;src/commands&#x22;, // events: &#x27;src/events&#x27; (optional), containerConfig: { get: useContainer, //pass in your dependency getter here },});"><div></div></button></div></figure></div>
<p>Using the <code dir="auto">Sern#makeDependencies</code> function, inject your dependencies.
Well use specific dependencies that are created with the <code dir="auto">@sern/keyword</code>
key.
Using typescript to display all <code dir="auto">keywords</code> and what they represent:</p>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="typescript"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">interface</span><span style="--0:#D6DEEB;--1:#403F53"> Dependencies {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/client</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">EventEmitter</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//Discord Client</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/logger</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">?:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">Logging</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//Logger</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/emitter</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">SernEmitter</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//SernEmitter</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/store</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">ModuleStore</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//Stores all Command Modules</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/modules</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">ModuleManager</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//Manages Modules</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">7</div></div><div class="code"><span class="indent"> </span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">@sern/errors</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#7FDBCA;--1:#097174">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Singleton</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">ErrorHandling</span><span style="--0:#D6DEEB;--1:#403F53">>; </span><span style="--0:#809191;--1:#5E6578">//A Lifetime / Crash Handler</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">8</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="export interface Dependencies { &#x22;@sern/client&#x22;: Singleton<EventEmitter>; //Discord Client &#x22;@sern/logger&#x22;?: Singleton<Logging>; //Logger &#x22;@sern/emitter&#x22;: Singleton<SernEmitter>; //SernEmitter &#x22;@sern/store&#x22;: Singleton<ModuleStore>; //Stores all Command Modules &#x22;@sern/modules&#x22;: Singleton<ModuleManager>; //Manages Modules &#x22;@sern/errors&#x22;: Singleton<ErrorHandling>; //A Lifetime / Crash Handler}"><div></div></button></div></figure></div>
<aside aria-label="Danger" class="starlight-aside starlight-aside--danger"><p class="starlight-aside__title" aria-hidden="true"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" class="starlight-aside__icon"><path d="M12 7C11.7348 7 11.4804 7.10536 11.2929 7.29289C11.1054 7.48043 11 7.73478 11 8V12C11 12.2652 11.1054 12.5196 11.2929 12.7071C11.4804 12.8946 11.7348 13 12 13C12.2652 13 12.5196 12.8946 12.7071 12.7071C12.8946 12.5196 13 12.2652 13 12V8C13 7.73478 12.8946 7.48043 12.7071 7.29289C12.5196 7.10536 12.2652 7 12 7ZM12 15C11.8022 15 11.6089 15.0586 11.4444 15.1685C11.28 15.2784 11.1518 15.4346 11.0761 15.6173C11.0004 15.8 10.9806 16.0011 11.0192 16.1951C11.0578 16.3891 11.153 16.5673 11.2929 16.7071C11.4327 16.847 11.6109 16.9422 11.8049 16.9808C11.9989 17.0194 12.2 16.9996 12.3827 16.9239C12.5654 16.8482 12.7216 16.72 12.8315 16.5556C12.9414 16.3911 13 16.1978 13 16C13 15.7348 12.8946 15.4804 12.7071 15.2929C12.5196 15.1054 12.2652 15 12 15ZM21.71 7.56L16.44 2.29C16.2484 2.10727 15.9948 2.00368 15.73 2H8.27C8.00523 2.00368 7.75163 2.10727 7.56 2.29L2.29 7.56C2.10727 7.75163 2.00368 8.00523 2 8.27V15.73C2.00368 15.9948 2.10727 16.2484 2.29 16.44L7.56 21.71C7.75163 21.8927 8.00523 21.9963 8.27 22H15.73C15.9948 21.9963 16.2484 21.8927 16.44 21.71L21.71 16.44C21.8927 16.2484 21.9963 15.9948 22 15.73V8.27C21.9963 8.00523 21.8927 7.75163 21.71 7.56ZM20 15.31L15.31 20H8.69L4 15.31V8.69L8.69 4H15.31L20 8.69V15.31Z"></path></svg>Danger</p><section class="starlight-aside__content"><p>Sern#addExternal has been deprecated and removed in favor of Sern#makeDependencies</p></section></aside>
<p>At the moment, one optional dependency, <code dir="auto">@sern/logger</code>, exists. If not added explicitly,
well <strong>autofill</strong> with a <a href="https://sern.dev/docs/api/classes/defaultlogging">DefaultLogger</a>.</p>
<aside aria-label="Tip" class="starlight-aside starlight-aside--tip"><p class="starlight-aside__title" aria-hidden="true"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" class="starlight-aside__icon"><path fill-rule="evenodd" clip-rule="evenodd" d="M1.43909 8.85483L1.44039 8.85354L4.96668 5.33815C5.30653 4.99386 5.7685 4.79662 6.2524 4.78972L6.26553 4.78963L12.9014 4.78962L13.8479 3.84308C16.9187 0.772319 20.0546 0.770617 21.4678 0.975145C21.8617 1.02914 22.2271 1.21053 22.5083 1.4917C22.7894 1.77284 22.9708 2.13821 23.0248 2.53199C23.2294 3.94517 23.2278 7.08119 20.1569 10.1521L19.2107 11.0983V17.7338L19.2106 17.7469C19.2037 18.2308 19.0067 18.6933 18.6624 19.0331L15.1456 22.5608C14.9095 22.7966 14.6137 22.964 14.29 23.0449C13.9663 23.1259 13.6267 23.1174 13.3074 23.0204C12.9881 22.9235 12.7011 22.7417 12.4771 22.4944C12.2533 22.2473 12.1006 21.9441 12.0355 21.6171L11.1783 17.3417L6.65869 12.822L4.34847 12.3589L2.38351 11.965C2.05664 11.8998 1.75272 11.747 1.50564 11.5232C1.25835 11.2992 1.07653 11.0122 0.979561 10.6929C0.882595 10.3736 0.874125 10.034 0.955057 9.7103C1.03599 9.38659 1.20328 9.09092 1.43909 8.85483ZM6.8186 10.8724L2.94619 10.096L6.32006 6.73268H10.9583L6.8186 10.8724ZM15.2219 5.21703C17.681 2.75787 20.0783 2.75376 21.1124 2.8876C21.2462 3.92172 21.2421 6.31895 18.783 8.77812L12.0728 15.4883L8.51172 11.9272L15.2219 5.21703ZM13.9042 21.0538L13.1279 17.1811L17.2676 13.0414V17.68L13.9042 21.0538Z"></path><path d="M9.31827 18.3446C9.45046 17.8529 9.17864 17.3369 8.68945 17.1724C8.56178 17.1294 8.43145 17.1145 8.30512 17.1243C8.10513 17.1398 7.91519 17.2172 7.76181 17.3434C7.62613 17.455 7.51905 17.6048 7.45893 17.7835C6.97634 19.2186 5.77062 19.9878 4.52406 20.4029C4.08525 20.549 3.6605 20.644 3.29471 20.7053C3.35607 20.3395 3.45098 19.9148 3.59711 19.476C4.01221 18.2294 4.78141 17.0237 6.21648 16.5411C6.39528 16.481 6.54504 16.3739 6.65665 16.2382C6.85126 16.0016 6.92988 15.678 6.84417 15.3647C6.83922 15.3466 6.83373 15.3286 6.82767 15.3106C6.74106 15.053 6.55701 14.8557 6.33037 14.7459C6.10949 14.6389 5.84816 14.615 5.59715 14.6994C5.47743 14.7397 5.36103 14.7831 5.24786 14.8294C3.22626 15.6569 2.2347 17.4173 1.75357 18.8621C1.49662 19.6337 1.36993 20.3554 1.30679 20.8818C1.27505 21.1464 1.25893 21.3654 1.25072 21.5213C1.24662 21.5993 1.24448 21.6618 1.24337 21.7066L1.243 21.7226L1.24235 21.7605L1.2422 21.7771L1.24217 21.7827L1.24217 21.7856C1.24217 22.3221 1.67703 22.7579 2.2137 22.7579L2.2155 22.7579L2.22337 22.7578L2.23956 22.7577C2.25293 22.7575 2.27096 22.7572 2.29338 22.7567C2.33821 22.7555 2.40073 22.7534 2.47876 22.7493C2.63466 22.7411 2.85361 22.725 3.11822 22.6932C3.64462 22.6301 4.36636 22.5034 5.13797 22.2464C6.58274 21.7653 8.3431 20.7738 9.17063 18.7522C9.21696 18.639 9.26037 18.5226 9.30064 18.4029C9.30716 18.3835 9.31304 18.364 9.31827 18.3446Z"></path></svg>Tip</p><section class="starlight-aside__content"><p>If you dont want a logger, add it to the
<code dir="auto">exclude</code> field while composing dependencies.</p></section></aside>
<p>Use your generated dependency getter <code dir="auto">useContainer</code> (use whatever name you want), access them
from anywhere.</p>
<aside aria-label="Note" class="starlight-aside starlight-aside--note"><p class="starlight-aside__title" aria-hidden="true"><svg viewBox="0 0 24 24" width="16" height="16" fill="currentColor" class="starlight-aside__icon"><path d="M12 11C11.7348 11 11.4804 11.1054 11.2929 11.2929C11.1054 11.4804 11 11.7348 11 12V16C11 16.2652 11.1054 16.5196 11.2929 16.7071C11.4804 16.8946 11.7348 17 12 17C12.2652 17 12.5196 16.8946 12.7071 16.7071C12.8946 16.5196 13 16.2652 13 16V12C13 11.7348 12.8946 11.4804 12.7071 11.2929C12.5196 11.1054 12.2652 11 12 11ZM12.38 7.08C12.1365 6.97998 11.8635 6.97998 11.62 7.08C11.4973 7.12759 11.3851 7.19896 11.29 7.29C11.2017 7.3872 11.1306 7.49882 11.08 7.62C11.024 7.73868 10.9966 7.86882 11 8C10.9992 8.13161 11.0245 8.26207 11.0742 8.38391C11.124 8.50574 11.1973 8.61656 11.29 8.71C11.3872 8.79833 11.4988 8.86936 11.62 8.92C11.7715 8.98224 11.936 9.00632 12.099 8.99011C12.2619 8.97391 12.4184 8.91792 12.5547 8.82707C12.691 8.73622 12.8029 8.61328 12.8805 8.46907C12.9582 8.32486 12.9992 8.16378 13 8C12.9963 7.73523 12.8927 7.48163 12.71 7.29C12.6149 7.19896 12.5028 7.12759 12.38 7.08ZM12 2C10.0222 2 8.08879 2.58649 6.4443 3.6853C4.79981 4.78412 3.51809 6.3459 2.76121 8.17317C2.00433 10.0004 1.8063 12.0111 2.19215 13.9509C2.578 15.8907 3.53041 17.6725 4.92894 19.0711C6.32746 20.4696 8.10929 21.422 10.0491 21.8079C11.9889 22.1937 13.9996 21.9957 15.8268 21.2388C17.6541 20.4819 19.2159 19.2002 20.3147 17.5557C21.4135 15.9112 22 13.9778 22 12C22 10.6868 21.7413 9.38642 21.2388 8.17317C20.7363 6.95991 19.9997 5.85752 19.0711 4.92893C18.1425 4.00035 17.0401 3.26375 15.8268 2.7612C14.6136 2.25866 13.3132 2 12 2ZM12 20C10.4178 20 8.87104 19.5308 7.55544 18.6518C6.23985 17.7727 5.21447 16.5233 4.60897 15.0615C4.00347 13.5997 3.84504 11.9911 4.15372 10.4393C4.4624 8.88743 5.22433 7.46197 6.34315 6.34315C7.46197 5.22433 8.88743 4.4624 10.4393 4.15372C11.9911 3.84504 13.5997 4.00346 15.0615 4.60896C16.5233 5.21447 17.7727 6.23984 18.6518 7.55544C19.5308 8.87103 20 10.4177 20 12C20 14.1217 19.1572 16.1566 17.6569 17.6569C16.1566 19.1571 14.1217 20 12 20Z"></path></svg>Note</p><section class="starlight-aside__content"><p>the function <a href="https://sern.dev/docs/api/modules#usecontainerraw">useContainerRaw</a> is provided for direct access to dependencies and the internal
data structure. Use this wisely as no guarantees are made and crashes can happen.</p></section></aside>
<p>The <code dir="auto">build</code> field follows <a href="https://itijs.org/docs/quick-start#usage">createContainer</a> function call.</p>
<h2 id="new-commandtypes">New CommandTypes</h2>
<p>2.0 includes all the new role select menus. <code dir="auto">CommandType.MenuSelect</code> has been renamed into
<code dir="auto">CommandType.StringSelect</code>. The remaining SelectMenus are
<code dir="auto">CommandType.RoleSelect</code>, <code dir="auto">CommandType.ChannelSelect</code>, <code dir="auto">CommandType.UserSelect</code>, <code dir="auto">CommandType.MentionableSelect</code></p>
<div class="expressive-code"><figure class="frame has-title not-content"><figcaption class="header"><span class="title">commands/roleselect.ts</span></figcaption><pre data-language="typescript"><code><div class="ec-line"><div class="gutter"><div class="ln">1</div></div><div class="code"><span style="--0:#C792EA;--1:#8D46B4">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C792EA;--1:#8D46B4">default</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#82AAFF;--1:#3C63B3">commandModule</span><span style="--0:#D6DEEB;--1:#403F53">({</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">2</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">type: CommandType</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#7FDBCA;--1:#097174">RoleSelect</span><span style="--0:#D6DEEB;--1:#403F53">,</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">3</div></div><div class="code"><span class="indent"> </span><span style="--0:#82AAFF;--1:#3C63B3">execute</span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--0:#D7DBE0;--1:#403F53">ctx</span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">4</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">ctx</span><span style="--0:#C792EA;--1:#8D46B4">.</span><span style="--0:#82AAFF;--1:#3C63B3">reply</span><span style="--0:#D6DEEB;--1:#403F53">(</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#ECC48D;--1:#9B504E">role select</span><span style="--0:#D9F5DD;--1:#111111">"</span><span style="--0:#D6DEEB;--1:#403F53">);</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">5</div></div><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">},</span></div></div><div class="ec-line"><div class="gutter"><div class="ln">6</div></div><div class="code"><span style="--0:#D6DEEB;--1:#403F53">});</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="export default commandModule({ type: CommandType.RoleSelect, execute(ctx) { ctx.reply(&#x22;role select&#x22;); },});"><div></div></button></div></figure></div>
<p>In addition, commandModules with ContextMenus have been renamed.</p>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="diff"><code><div class="ec-line highlight del"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">CommandType.MenuUser, CommandType.MenuMsg</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">CommandType.CtxUser, CommandType.CtxMsg</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="CommandType.MenuUser, CommandType.MenuMsgCommandType.CtxUser, CommandType.CtxMsg"><div></div></button></div></figure></div>
<h2 id="typings-simplification">Typings Simplification</h2>
<p>Pre 2.0:
<img src="https://cdn.discordapp.com/attachments/820348341358952550/1038577974829666386/image.png">
<br> <br> <br>
Post 2.0:
<br>
<img src="https://cdn.discordapp.com/attachments/820348341358952550/1052623728489550015/image.png"></p>
<p>CommandPlugin&#x3C;T> and EventPlugin&#x3C;T> typings have also been staticified, transformed from types to interfaces</p>
<h2 id="breaking-changes">Breaking Changes</h2>
<img src="https://img.srizan.dev/Discord_z8Sn1UBfEe.png">
<br>
All deprecation warnings from previous versions have taken effect, and are removed in 2.0.
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> Module </span><span style="--0:#c995eb;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">EventModule</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#075557">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">CommandModule</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> AnyModule </span><span style="--0:#cb9bec;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">EventModule</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#7FDBCA;--1:#075759">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">CommandModule</span></div></div><div class="ec-line"><div class="code">
</div></div><div class="ec-line highlight del"><div class="code"><span style="--0:#c995eb;--1:#6a3587">export</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#c995eb;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> SpreadParams&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#c995eb;--1:#6a3587">extends</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--0:#7FDBCA;--1:#075557">...</span><span style="--0:#D7DBE0;--1:#403F53">args</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">never</span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#c995eb;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">unknown</span><span style="--0:#D6DEEB;--1:#403F53">> </span><span style="--0:#c995eb;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> (</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"><span style="--1:#403F53"> </span></span><span style="--0:#D7DBE0;--1:#403F53">args</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Parameters</span><span style="--0:#D6DEEB;--1:#403F53">&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53">>[</span><span style="--0:#C5E478;--1:#2d4a86">number</span><span style="--0:#D6DEEB;--1:#403F53">],</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">) </span><span style="--0:#c995eb;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">unknown</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code=" type Module = EventModule | CommandModule type AnyModule = EventModule | CommandModuleexport type SpreadParams<T extends (...args: never) => unknown> = ( args: Parameters<T>[number], ) => unknown;"><div></div></button></div></figure></div>
<p>Override type has been removed due to redundancy</p>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="diff"><code><div class="ec-line highlight del"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">discord.js : 14.5</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">discord.js : 14.7</span></div></div><div class="ec-line"><div class="code">
</div></div><div class="ec-line highlight del"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">typescript: 4.7</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">typescript: 4.9</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code=" discord.js : 14.5 discord.js : 14.7typescript: 4.7 typescript: 4.9"><div></div></button></div></figure></div>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">interface</span><span style="--0:#D6DEEB;--1:#403F53"> Wrapper {</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> defaultPrefix</span><span style="--0:#7FDBCA;--1:#075759">?:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2e4c89">string</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> commands</span><span style="--0:#7FDBCA;--1:#075759">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2e4c89">string</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> events</span><span style="--0:#7FDBCA;--1:#075759">?:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2e4c89">string</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#cb9bec;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> containerConfig </span><span style="--0:#7FDBCA;--1:#075759">:</span><span style="--0:#D6DEEB;--1:#403F53"> {</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"> </span><span style="--0:#86adff;--1:#2e4c89">get</span><span style="--0:#7FDBCA;--1:#075759">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">(</span><span style="--0:#7FDBCA;--1:#075759">...</span><span style="--0:#D7DBE0;--1:#403F53">keys</span><span style="--0:#7FDBCA;--1:#075759">:</span><span style="--0:#D6DEEB;--1:#403F53"> (</span><span style="--0:#7FDBCA;--1:#075759">keyof</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Dependencies</span><span style="--0:#D6DEEB;--1:#403F53">)[]</span><span style="--0:#D9F5DD;--1:#111111">)</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2e4c89">unknown</span><span style="--0:#D6DEEB;--1:#403F53">[];</span></div></div><div class="ec-line highlight ins"><div class="code"><span class="indent"><span style="--0:#D6DEEB;--1:#403F53"> </span></span><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div><div class="ec-line"><div class="code">
</div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">interface</span><span style="--0:#D6DEEB;--1:#403F53"> Wrapper {</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> client</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">Client</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> sernEmitter</span><span style="--0:#7FDBCA;--1:#075557">?:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">SernEmitter</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> defaultPrefix</span><span style="--0:#7FDBCA;--1:#075557">?:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">string</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> commands</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">string</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#c995eb;--1:#6a3587">readonly</span><span style="--0:#D6DEEB;--1:#403F53"> events</span><span style="--0:#7FDBCA;--1:#075557">?:</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#075557">|</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">string</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#075557">|</span><span style="--0:#D6DEEB;--1:#403F53"> { mod</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">EventModule</span><span style="--0:#D6DEEB;--1:#403F53">; absPath</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">string</span><span style="--0:#D6DEEB;--1:#403F53"> }[]</span></div></div><div class="ec-line highlight del"><div class="code"><span class="indent"> </span><span style="--0:#7FDBCA;--1:#075557">|</span><span style="--0:#D6DEEB;--1:#403F53"> (</span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#c995eb;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> { mod</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">EventModule</span><span style="--0:#D6DEEB;--1:#403F53">; absPath</span><span style="--0:#7FDBCA;--1:#075557">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2d4a86">string</span><span style="--0:#D6DEEB;--1:#403F53"> }[]);</span></div></div><div class="ec-line highlight del"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">}</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code=" interface Wrapper { readonly defaultPrefix?: string; readonly commands: string; readonly events?: string; readonly containerConfig : { get: (...keys: (keyof Dependencies)[]) => unknown[]; }} interface Wrapper { readonly client: Client; readonly sernEmitter?: SernEmitter; readonly defaultPrefix?: string; readonly commands: string; readonly events?: | string | { mod: EventModule; absPath: string }[] | (() => { mod: EventModule; absPath: string }[]);}"><div></div></button></div></figure></div>
<div class="expressive-code"><figure class="frame not-content"><figcaption class="header"></figcaption><pre data-language="ts"><code><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">DefaultLogger</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">DefaultModuleManager</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">SernEmitter</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#D6DEEB;--1:#403F53">DefaultErrorHandling</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> Singleton&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53">> </span><span style="--0:#cb9bec;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">T</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> Transient&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53">> </span><span style="--0:#cb9bec;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=></span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53">;</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">type</span><span style="--0:#D6DEEB;--1:#403F53"> LogPayload&#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#cb9bec;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#C5E478;--1:#2e4c89">unknown</span><span style="--0:#D6DEEB;--1:#403F53">> </span><span style="--0:#cb9bec;--1:#6a3587">=</span><span style="--0:#D6DEEB;--1:#403F53"> { message</span><span style="--0:#7FDBCA;--1:#075759">:</span><span style="--0:#D6DEEB;--1:#403F53"> </span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#D6DEEB;--1:#403F53"> }</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">export const </span><span style="--0:#86adff;--1:#2e4c89">single</span><span style="--0:#cb9bec;--1:#6a3587"> = &#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#cb9bec;--1:#6a3587">></span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#cb9bec;--1:#6a3587"> => </span><span style="--0:#86adff;--1:#2e4c89">T</span></div></div><div class="ec-line highlight ins"><div class="code"><span style="--0:#cb9bec;--1:#6a3587">export const </span><span style="--0:#86adff;--1:#2e4c89">many</span><span style="--0:#cb9bec;--1:#6a3587"> = &#x3C;</span><span style="--0:#FFCB8B;--1:#111111">T</span><span style="--0:#cb9bec;--1:#6a3587">></span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#cb9bec;--1:#6a3587"> => </span><span style="--0:#D9F5DD;--1:#111111">()</span><span style="--0:#cb9bec;--1:#6a3587"> => </span><span style="--0:#86adff;--1:#2e4c89">T</span></div></div></code></pre><div class="copy"><button title="Copy to clipboard" data-copied="Copied!" data-code="DefaultLoggerDefaultModuleManagerSernEmitterDefaultErrorHandlingtype Singleton<T> = () => Ttype Transient<T> = () => () => T;type LogPayload<T = unknown> = { message: T }export const single = <T>() => Texport const many = <T>() => () => T"><div></div></button></div></figure></div>
<p>Including the previous section, some names to symbols and data structures were altered to
be better represented. view <a href="/404.html">changelog</a></p>
<h2 id="context-refactoring">Context refactoring</h2>
<p>The context data structure has been internally altered to represent its dynamics better.</p> </div> <footer class="astro-dr56dw7m"> <div class="astro-sg3lsd66"><b class="astro-sg3lsd66">Tags: </b><ul class="astro-sg3lsd66"><li class="astro-sg3lsd66"><a href="/blog/tags/release" class="astro-sg3lsd66">release</a></li></ul></div> </footer> </article> </div> <footer class="not-content astro-w2yzoj57"> <div class="pagination astro-q3jscx35" data-pagefind-ignore><div class="card-grid astro-zntqmydn"><div class="sl-link-card astro-mf7fz2mj"> <span class="sl-flex stack astro-mf7fz2mj"> <a href="/blog/2" rel="next" class="astro-q3jscx35 astro-mf7fz2mj"> <span class="title astro-mf7fz2mj">Older posts</span> </a> </span> <svg aria-hidden="true" class="icon rtl:flip astro-mf7fz2mj astro-c6vsoqas" width="16" height="16" viewBox="0 0 24 24" fill="currentColor" style="--sl-icon-size: 1.333em;"><path d="M17.92 11.62a1.001 1.001 0 0 0-.21-.33l-5-5a1.003 1.003 0 1 0-1.42 1.42l3.3 3.29H7a1 1 0 0 0 0 2h7.59l-3.3 3.29a1.002 1.002 0 0 0 .325 1.639 1 1 0 0 0 1.095-.219l5-5a1 1 0 0 0 .21-.33 1 1 0 0 0 0-.76Z"/></svg> </div> </div> </div> </footer> </div> <footer class="astro-3yyafb3n"> <div class="meta sl-flex astro-3yyafb3n"> </div> <div class="pagination-links astro-u2l5gyhi" dir="ltr"> </div> </footer> </div> </div> </main> </div> </div> </div> </div> </body></html>