Archived
0
0
Fork 0

Compare commits

...

8 commits

16 changed files with 2421 additions and 585 deletions

6
.gitignore vendored
View file

@ -1,2 +1,4 @@
bin .yarn/cache
obj .yarn/install-state.gz
node_modules
dist

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

768
.yarn/releases/yarn-3.1.1.cjs vendored Executable file

File diff suppressed because one or more lines are too long

11
.yarnrc.yml Normal file
View file

@ -0,0 +1,11 @@
nmMode: hardlinks-local
nodeLinker: node-modules
plugins:
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
spec: "@yarnpkg/plugin-interactive-tools"
- path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs
spec: "@yarnpkg/plugin-typescript"
yarnPath: .yarn/releases/yarn-3.1.1.cjs

1
BUGS
View file

@ -1 +0,0 @@
- Rare hanging

View file

@ -631,8 +631,8 @@ to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found. the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.> backend
Copyright (C) <year> <name of author> Copyright (C) 2021 Furbook
This program is free software: you can redistribute it and/or modify This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode: notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author> <program> Copyright (C) 2021 Furbook
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details. under certain conditions; type `show c' for details.

View file

@ -1,498 +0,0 @@
using System.Diagnostics;
using System.Text;
using System.Text.RegularExpressions;
using Discord;
using Discord.WebSocket;
using DiscordRPC;
using Microsoft.Extensions.Configuration;
using RestSharp;
using Terminal.Gui;
using Terminal.Gui.Trees;
using Attribute = Terminal.Gui.Attribute;
using Button = Terminal.Gui.Button;
using Color = Terminal.Gui.Color;
namespace chord
{
public class Program
{
private ListView chatBoxList;
private List<string> currentChannelMessages;
private ulong currentSelectedChannel;
private ulong currentSelectedGuild;
private SortedDictionary<ulong, List<ulong>> guilds;
private DiscordRpcClient rpcClient;
private Settings settings;
private Window window;
public static void Main()
{
new Program().Start();
}
private async void Start()
{
try {
#if DEBUG
var config = new ConfigurationBuilder()
.AddJsonFile("config.json")
.Build();
#else
var config = new ConfigurationBuilder()
.AddJsonFile($"{Environment.GetEnvironmentVariable("HOME")}/.config/chord/config.json")
.Build();
#endif
settings = config.Get<Settings>();
var client = new DiscordSocketClient(new DiscordSocketConfig
{ AlwaysDownloadUsers = true, GatewayIntents = GatewayIntents.All });
await client.LoginAsync(TokenType.Bot, settings.Token);
await client.StartAsync();
if (settings.EnableRichPresence) {
rpcClient = new DiscordRpcClient("923436807297859625");
rpcClient.Initialize();
rpcClient.SetPresence(new RichPresence());
}
Application.Init();
window = new Window("chord")
{
X = 0,
Y = 1,
Width = Dim.Fill(),
Height = Dim.Fill(),
ColorScheme =
{
Normal = new Attribute(Color.White, Color.Black)
}
};
var menuBar = buildMenu();
var loadingLabel = new Label("Loading...")
{
X = 0,
Y = 0,
Width = Dim.Fill(),
Height = Dim.Fill(),
TextAlignment = TextAlignment.Centered,
VerticalTextAlignment = VerticalTextAlignment.Middle,
};
client.Ready += () =>
{
guilds = new SortedDictionary<ulong, List<ulong>>();
foreach (var guild in client.Guilds)
{
guilds.Add(guild.Id, new List<ulong>());
foreach (var channel in guild.TextChannels)
{
var findGuild = guilds.GetValueOrDefault(guild.Id);
if (channel.Users.ToList().Find(user => user.Id == client.CurrentUser.Id) == null) continue;
if (findGuild == null) continue;
findGuild.Add(channel.Id);
findGuild.Sort();
}
}
var serverList = buildServerList();
var channelList = buildChannelList(serverList);
var chatBox = buildChatBox(serverList);
var messageBox = buildMessageBox(serverList, chatBox);
var userList = buildUserList(chatBox);
var serverListList = new ListView
{
X = 0,
Y = 0,
Width = Dim.Fill(),
Height = Dim.Fill()
};
var guildNames = guilds.Select(guild => client.GetGuild(guild.Key).Name).ToList();
serverListList.SetSource(guildNames);
var channelListTree = new TreeView
{
X = 0,
Y = 0,
Width = Dim.Fill(),
Height = Dim.Fill()
};
chatBoxList = new ListView
{
X = 0,
Y = 0,
Width = Dim.Fill(),
Height = Dim.Fill()
};
var messageBoxText = new TextView
{
X = 0,
Y = 0,
Width = Dim.Percent(95),
Height = Dim.Fill()
};
var messageBoxSend = new Button("Send", true)
{
X = Pos.Right(messageBoxText) - 2,
Y = 0
};
var userListTree = new TreeView
{
X = 0,
Y = 0,
Width = Dim.Fill(),
Height = Dim.Fill()
};
serverListList.OpenSelectedItem += args =>
{
channelListTree.ClearObjects();
currentSelectedGuild = guilds.Keys.ToList()[args.Item];
var channelNames = guilds.GetValueOrDefault(currentSelectedGuild)!
.Select(channel => client.GetGuild(currentSelectedGuild).GetTextChannel(channel).Name).ToList();
var categoryDict = new SortedDictionary<ulong, TreeNode>();
foreach (var categories in client.GetGuild(currentSelectedGuild).CategoryChannels)
{
var categoryName = Regex.Replace(categories.Name, @"[^\u0000-\u007F]+", string.Empty);
var node = new TreeNode(categoryName);
foreach(var channel in categories.Channels)
{
if (channel.GetType().Name == "SocketTextChannel")
{
var channelName = Regex.Replace(channel.Name, @"[^\u0000-\u007F]+", string.Empty);
var channelNode = new TreeNode(channelName);
channelNode.Tag = new { Id = channel.Id };
node.Children.Add(channelNode);
}
}
categoryDict.Add(categories.Id, node);
}
foreach (var category in categoryDict)
{
channelListTree.AddObject(category.Value);
}
if (settings.EnableRichPresence) {
rpcClient.UpdateDetails($"Chatting in {client.GetGuild(currentSelectedGuild).Name}");
}
};
channelListTree.SelectionChanged += async (arg1, arg2) =>
{
userListTree.ClearObjects();
try {
currentSelectedChannel = (ulong)arg2.NewValue.Tag.GetType().GetProperty("Id").GetValue(arg2.NewValue.Tag);
} catch {
return;
}
try {
var restSharpClient = new RestClient("https://discord.com/api/v9");
var restSharpReq = new RestRequest($"channels/{currentSelectedChannel}/messages");
restSharpClient.AddDefaultHeader("Authorization", settings.Token);
var response = await restSharpClient.GetAsync<List<GetMessagesResponse>>(restSharpReq);
var messages = new List<string>();
foreach (var msg in response)
{
var msgNewLines = msg.content.Split("\n").ToList();
var firstMsg = msgNewLines[0];
msgNewLines.RemoveAt(0);
msgNewLines.Reverse();
messages.AddRange(msgNewLines.Select(message => $"{message}"));
messages.Add($"{msg.author.username}#{msg.author.discriminator} | {firstMsg}");
if (msg.embeds.Count != 0)
messages.Add($"{msg.author.username}#{msg.author.discriminator} | [Unable to display embed]");
if (msg.attachments.Count == 0) continue;
messages.AddRange(msg.attachments
.Select(attachment => $"{msg.author.username}#{msg.author.discriminator} | {attachment.url}")
.Select(dummy => dummy));
}
messages.Reverse();
await chatBoxList.SetSourceAsync(messages);
currentChannelMessages = messages;
chatBoxList.ScrollDown(currentChannelMessages.Count - chatBoxList.Bounds.Height);
chatBoxList.SelectedItem = currentChannelMessages.Count - 1;
var rolesDict = new SortedDictionary<int, TreeNode>();
foreach (var roles in client.GetGuild(currentSelectedGuild).Roles)
{
if (roles.IsHoisted) {
if (roles.Members.Count() != 0) {
var roleName = Regex.Replace(roles.Name, @"[^\u0000-\u007F]+", string.Empty);
var node = new TreeNode(roleName);
foreach (var users in roles.Members)
{
var userName = Regex.Replace(users.Username, @"[^\u0000-\u007F]+", string.Empty);
string userNick = string.Empty;
if (users.Nickname != null)
userNick = Regex.Replace(users.Nickname, @"[^\u0000-\u007F]+", string.Empty);
node.Children.Add(new TreeNode($"{userName}#{users.Discriminator} ({userNick})"));
}
rolesDict.TryAdd(Math.Abs(roles.Position - client.GetGuild(currentSelectedGuild).Roles.Count()), node);
}
}
}
foreach (var role in rolesDict)
{
userListTree.AddObject(role.Value);
}
if (settings.EnableRichPresence) {
rpcClient.UpdateState($"In channel {client.GetGuild(currentSelectedGuild).GetTextChannel(currentSelectedChannel).Name}");
rpcClient.UpdateStartTime();
}
} catch(Exception err) {
Console.WriteLine(err);
await chatBoxList.SetSourceAsync(new List<string>());
}
};
messageBoxSend.Clicked += async () =>
{
var restSharpClient = new RestClient("https://discord.com/api/v9");
var restSharpReq = new RestRequest($"channels/{currentSelectedChannel}/messages");
restSharpClient.AddDefaultHeader("Authorization", settings.Token);
restSharpReq.AddJsonBody(new { content = Encoding.UTF8.GetString(messageBoxText.Text.ToByteArray()) });
await restSharpClient.PostAsync<List<object>>(restSharpReq);
messageBoxText.Text = "";
};
chatBoxList.OpenSelectedItem += args =>
{
if (currentChannelMessages[args.Item].Split(" | ")[1].Contains("http"))
for (var i = 0; i < currentChannelMessages[args.Item].Split(" | ")[1].Split(" ").Count(); i++)
if (currentChannelMessages[args.Item].Split(" | ")[1].Split(" ")[i].Contains("http"))
{
var procStartInfo = new ProcessStartInfo("/bin/sh",
$"-c \"xdg-open {currentChannelMessages[args.Item].Split(" | ")[1].Split(" ")[i]}\"")
{
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
UseShellExecute = false
};
var proc = new Process();
proc.StartInfo = procStartInfo;
proc.Start();
}
};
Application.Top.KeyPress += async args =>
{
switch (ShortcutHelper.GetModifiersKey(args.KeyEvent)) {
case Key.CtrlMask | Key.S:
serverListList.SetFocus();
break;
case Key.CtrlMask | Key.C:
channelListTree.SetFocus();
break;
case Key.CtrlMask | Key.AltMask | Key.C:
chatBoxList.SetFocus();
break;
case Key.CtrlMask | Key.U:
userListTree.SetFocus();
break;
case Key.CtrlMask | Key.Enter:
var restSharpClient = new RestClient("https://discord.com/api/v9");
var restSharpReq = new RestRequest($"channels/{currentSelectedChannel}/messages");
restSharpClient.AddDefaultHeader("Authorization", settings.Token);
restSharpReq.AddJsonBody(new { content = Encoding.UTF8.GetString(messageBoxText.Text.ToByteArray()) });
await restSharpClient.PostAsync<List<object>>(restSharpReq);
messageBoxText.Text = "";
break;
}
};
window.RemoveAll();
window.Add(serverList, channelList, messageBox, chatBox, userList);
serverList.Add(serverListList);
channelList.Add(channelListTree);
chatBox.Add(chatBoxList);
messageBox.Add(messageBoxText, messageBoxSend);
userList.Add(userListTree);
return Task.CompletedTask;
};
client.MessageReceived += async msg =>
{
if (msg.Channel.Id != currentSelectedChannel) return;
var restSharpClient = new RestClient("https://discord.com/api/v9");
var restSharpReq = new RestRequest($"channels/{currentSelectedChannel}/messages");
restSharpReq.AddQueryParameter("limit", "1");
restSharpClient.AddDefaultHeader("Authorization", settings.Token);
var response = await restSharpClient.GetAsync<List<GetMessagesResponse>>(restSharpReq);
currentChannelMessages.Add(
$"{response.First().author.username}#{response.First().author.discriminator} | {response.First().content}");
await chatBoxList.SetSourceAsync(currentChannelMessages);
chatBoxList.ScrollDown(currentChannelMessages.Count - chatBoxList.Bounds.Height);
chatBoxList.SelectedItem = currentChannelMessages.Count - 1;
};
Application.MainLoop.AddTimeout(TimeSpan.FromMilliseconds(100), caller => {
if (settings.EnableRichPresence)
rpcClient.Invoke();
return true;
});
Application.Top.Add(window, menuBar);
window.Add(loadingLabel);
Application.Run();
Application.Shutdown();
} catch (System.Exception err) {
Console.WriteLine(err);
Application.Shutdown();
}
}
private Window buildChatBox(Window serverList)
{
return new Window("Chat Box")
{
X = Pos.Right(serverList),
Y = 0,
Width = Dim.Percent(60),
Height = Dim.Percent(90)
};
}
private Window buildChannelList(Window serverList)
{
return new Window("Channel List")
{
X = 0,
Y = Pos.Bottom(serverList),
Width = Dim.Percent(30),
Height = Dim.Percent(50)
};
}
private MenuBar buildMenu()
{
return new MenuBar(new[]
{
new MenuBarItem("File", new[]
{
new MenuItem("_Quit", "Quit the Application", () => { Application.Top.Running = false; })
}),
new MenuBarItem("Help", new[]
{
new MenuItem("_License", "See the Application License", () => {
MessageBox.Query("License", "chord Copyright (C) 2021 Daryl Ronningen\nThis program comes with ABSOLUTELY NO WARRANTY; for details see section `15` of the GPL license\nThis is free software, and you are welcome to redistribute it under certain conditions; for details see section `2` of the GPL license", "Close");
})
})
});
}
private Window buildMessageBox(Window serverList, Window chatBox)
{
return new Window("Message Box")
{
X = Pos.Right(serverList),
Y = Pos.Bottom(chatBox),
Width = Dim.Percent(60),
Height = Dim.Percent(10)
};
}
private Window buildUserList(Window chatBox)
{
return new Window("User List")
{
X = Pos.Right(chatBox),
Y = 0,
Width = Dim.Percent(10),
Height = Dim.Fill()
};
}
private Window buildServerList()
{
return new Window("Server List")
{
X = 0,
Y = 0,
Width = Dim.Percent(30),
Height = Dim.Percent(50)
};
}
}
}
public class Settings
{
public string Token { get; set; }
public bool EnableRichPresence { get; set; }
}
public class GetMessagesResponse
{
public string content { get; set; }
public MessageAuthor author { get; set; }
public List<object> embeds { get; set; }
public List<MessageAttachments> attachments { get; set; }
}
public class MessageAuthor
{
public string username { get; set; }
public string discriminator { get; set; }
}
public class MessageAttachments
{
public string url { get; set; }
}

View file

@ -1,17 +0,0 @@
# Chord
A C# Discord TUI Client
## Getting Started
Add a `config.json` to `~/.config/chord`;
```json
{
"Token": "USER/BOT TOKEN HERE"
}
```
## Whats Left to do
You can keep track on what my current roadmap for the project in [TODO](https://code.relms.dev/Relms/chord/src/branch/master/TODO).
## Disclaimer
I AM NOT responsible if your discord account gets terminated for using this Third Party Client. Using a third party client is against TOS and using this client you can risk getting your account banned.

8
TODO
View file

@ -1,8 +0,0 @@
- Figure out how to bypass discord intents for user list (Currently just using Discord.NET cache)
- Message Conversion
- Convert message attachments to links (DONE)
- Sort Channels by catagories (DONE)
- DMs
- Loading Screen (DONE)
- Hotkeys (Partially Done. Still some weird stuff that happens that idfk why happens)
- User roles sorting (DONE)

View file

@ -1,34 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Configurations>Release;Debug</Configurations>
<Platforms>x64</Platforms>
<IsPackable>false</IsPackable>
<AssemblyVersion>0.0.4.0</AssemblyVersion>
<FileVersion>0.0.4.0</FileVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
<DebugType>None</DebugType>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
<DebugType>Full</DebugType>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Discord.Net.Labs" Version="3.5.0" />
<PackageReference Include="DiscordRichPresence" Version="1.0.175" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0" />
<PackageReference Include="Restsharp" Version="106.15.0" />
<PackageReference Include="Terminal.Gui" Version="1.4.0" />
</ItemGroup>
</Project>

View file

@ -1,22 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30114.105
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "chord", "chord.csproj", "{08889332-CBCB-4FFD-8D45-A3329FC11081}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Release|x64 = Release|x64
Debug|x64 = Debug|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{08889332-CBCB-4FFD-8D45-A3329FC11081}.Debug|x64.ActiveCfg = Debug|x64
{08889332-CBCB-4FFD-8D45-A3329FC11081}.Debug|x64.Build.0 = Debug|x64
{08889332-CBCB-4FFD-8D45-A3329FC11081}.Release|x64.ActiveCfg = Release|x64
{08889332-CBCB-4FFD-8D45-A3329FC11081}.Release|x64.Build.0 = Release|x64
EndGlobalSection
EndGlobal

36
package.json Normal file
View file

@ -0,0 +1,36 @@
{
"name": "chord",
"description": "A third party Discord client for the terminal",
"version": "0.1.0",
"license": "GPL-3.0-OR-LATER",
"homepage": "https://code.relms.dev/Relms/chord/src/branch/master/README.md",
"main": "dist/index.js",
"types": "dist/index.d.ts",
"packageManager": "yarn@3.1.1",
"author": {
"name": "Daryl Ronningen",
"email": "relms@relms.dev"
},
"bugs": {
"url": "https://code.relms.dev/Relms/chord/issues"
},
"repository": {
"url": "https://code.relms.dev/Relms/chord",
"type": "git"
},
"dependencies": {
"axios": "^0.24.0",
"blessed": "^0.1.81",
"blessed-contrib": "^4.10.1",
"config": "^3.3.6",
"discord.js": "https://github.com/Relms12345/discord.js.git#commit=f792a34bf7925cbf74e4c5799b74b66da93b3d5f",
"ws": "^8.4.0"
},
"devDependencies": {
"@types/blessed": "^0.1.19",
"@types/config": "^0.0.40",
"@types/node": "^17.0.4",
"@types/ws": "^8.2.2",
"typescript": "^4.5.4"
}
}

289
src/index.ts Normal file
View file

@ -0,0 +1,289 @@
process.env['NODE_CONFIG_DIR'] = process.env['HOME'] + '/.config/chord/';
process.env['NODE_CONFIG_ENV'] = 'config';
import blessed from 'blessed';
import blessedContrib from 'blessed-contrib';
import config from 'config';
import { Client } from 'discord.js';
let currentSelectedChannel: string = '';
let currentSelectedGuild: string = '';
const screen = blessed.screen({
smartCSR: true,
title: 'chord',
});
const mainWindow = blessed.box({
top: 0,
left: 0,
width: '100%',
height: '100%',
border: 'line',
label: 'chord',
mouse: true,
});
const serverList = blessed.box({
parent: mainWindow,
top: 0,
left: 0,
width: '30%',
height: '49%',
border: 'line',
label: 'Server List',
mouse: true,
});
const channelList = blessed.box({
parent: mainWindow,
top: '49%',
left: 0,
width: '30%',
height: '49%',
border: 'line',
label: 'Channel List',
mouse: true,
});
const chatBox = blessed.box({
parent: mainWindow,
top: 0,
left: '30%',
width: '60%',
height: '85%',
border: 'line',
label: 'Chat Box',
mouse: true,
});
const messageBox = blessed.box({
parent: mainWindow,
top: '85%',
left: '30%',
width: '60%',
height: '13%',
border: 'line',
label: 'Message Box',
mouse: true,
});
const userList = blessed.box({
parent: mainWindow,
top: 0,
left: '90%',
width: '9%',
height: '98%',
border: 'line',
label: 'User List',
mouse: true,
});
const serverListList = blessed.list({
parent: serverList,
top: 0,
left: 0,
width: '98%',
height: '96%',
keys: true,
vi: true,
mouse: true,
style: {
selected: {
fg: 'white',
bg: 'grey',
},
},
});
const channelListList = blessed.list({
parent: channelList,
top: 0,
left: 0,
width: '98%',
height: '96%',
keys: true,
vi: true,
mouse: true,
style: {
selected: {
fg: 'white',
bg: 'grey',
},
},
});
const chatBoxList = blessed.list({
parent: chatBox,
top: 0,
left: 0,
width: '99%',
height: '98%',
keys: true,
vi: true,
mouse: true,
style: {
selected: {
fg: 'white',
bg: 'grey',
},
},
});
const userListList = blessed.list({
parent: userList,
top: 0,
left: 0,
width: '95%',
height: '98%',
keys: true,
vi: true,
mouse: true,
style: {
selected: {
fg: 'white',
bg: 'grey',
},
},
});
const messageBoxForm = blessed.form({
parent: messageBox,
top: 0,
left: 0,
width: '98%',
height: '87%',
mouse: true,
});
const messageBoxInput = blessed.textarea({
parent: messageBoxForm,
top: 0,
left: 0,
width: '90%',
height: '87%',
keys: true,
vi: true,
mouse: true,
});
const messageBoxSubmit = blessed.button({
parent: messageBoxForm,
top: 0,
left: '95%',
width: '4%',
height: '87%',
keys: true,
vi: true,
mouse: true,
content: 'Send',
});
screen.append(mainWindow);
const client = new Client({
waitGuildTimeout: 0,
intents: 32767,
});
client.on('ready', () => {
client.guilds.cache.forEach((val) => {
serverListList.addItem(val.name);
});
screen.render();
});
client.on('error', (err) => {
throw err;
});
client.login(config.get('token'));
serverListList.on('select', (item) => {
channelListList.clearItems();
const findGuild = client.guilds.cache.find((val) => val.name === item.content);
if (findGuild) {
currentSelectedGuild = findGuild.id;
findGuild.channels.cache.forEach((val) => {
if (val.type === 'GUILD_TEXT' && val.members.find((val) => val.id === client.user!.id))
channelListList.addItem(val.name);
});
}
screen.render();
});
channelListList.on('select', async (item) => {
chatBoxList.clearItems();
const findChannel = client.channels.cache.find((val) => val.isText() && val.type === 'GUILD_TEXT' && val.name === item.content);
if (findChannel) {
currentSelectedChannel = findChannel.id;
if (findChannel.isText()) {
const messages = await findChannel.messages.fetch({ limit: 100 });
messages.reverse().forEach((val) => {
const createdTimeStamp = new Date(val.createdTimestamp);
chatBoxList.addItem(`${createdTimeStamp.toISOString()} (${val.author.username}#${val.author.discriminator}) | ${val.content}`);
});
}
}
chatBoxList.setScrollPerc(100);
chatBoxList.select(100);
screen.render();
});
messageBoxSubmit.on('press', async () => {
const findChannel = await client.channels.fetch(currentSelectedChannel);
if (findChannel && findChannel.isText()) {
const msg = await findChannel.send(messageBoxInput.value);
chatBoxList.addItem(`${new Date(msg.createdTimestamp).toISOString()} (${msg.author.username}#${msg.author.discriminator}) | ${msg.content}`);
chatBoxList.setScrollPerc(100);
messageBoxInput.setValue('');
}
screen.render();
});
screen.key('S-q', () => {
process.exit(0);
});
screen.key('S-s', () => {
serverListList.focus();
});
screen.key('S-c', () => {
channelListList.focus();
});
screen.key('S-u', () => {
userListList.focus();
});
screen.key('S-b', () => {
chatBoxList.focus();
});
screen.key('S-m', () => {
messageBoxInput.focus();
});
screen.key('S-r', () => {
messageBoxSubmit.focus();
});
serverListList.focus();
screen.render();

48
tsconfig.json Normal file
View file

@ -0,0 +1,48 @@
{
"compilerOptions": {
"declaration": true,
"lib": [
"ES2021",
"DOM"
],
"module": "CommonJS",
"outDir": "dist",
"removeComments": false,
"target": "ES2021",
"alwaysStrict": true,
"noImplicitAny": true,
"noImplicitThis": true,
"strict": true,
"strictBindCallApply": true,
"strictFunctionTypes": true,
"strictNullChecks": true,
"strictPropertyInitialization": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"noFallthroughCasesInSwitch": true,
"noImplicitReturns": true,
"noPropertyAccessFromIndexSignature": true,
"noUncheckedIndexedAccess": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowUnreachableCode": false,
"allowUnusedLabels": false,
"disableSizeLimit": true,
"explainFiles": false,
"extendedDiagnostics": false,
"forceConsistentCasingInFileNames": true,
"importsNotUsedAsValues": "error",
"listEmittedFiles": false,
"listFiles": false,
"newLine": "lf",
"noEmitOnError": false,
"preserveConstEnums": true,
"traceResolution": false,
"moduleResolution": "Node"
},
"include": [
"src/**/*.ts"
]
}

890
yarn.lock Normal file
View file

@ -0,0 +1,890 @@
# This file is generated by running "yarn install" inside your project.
# Manual changes might be lost - proceed with caution!
__metadata:
version: 5
cacheKey: 8
"@discordjs/builders@npm:^0.11.0":
version: 0.11.0
resolution: "@discordjs/builders@npm:0.11.0"
dependencies:
"@sindresorhus/is": ^4.2.0
discord-api-types: ^0.26.0
ts-mixer: ^6.0.0
tslib: ^2.3.1
zod: ^3.11.6
checksum: 7a25b59bb52d2e3695bca27946a99cf2de95b7edd5be424ea9f4707a465524be21263e25e532e12438e99f9f55fb98b033885c760aeb96424b8c12f663f50760
languageName: node
linkType: hard
"@discordjs/collection@npm:^0.4.0":
version: 0.4.0
resolution: "@discordjs/collection@npm:0.4.0"
checksum: fa8fc4246921f3230eb6c5d6d4dc0caf9dd659fcc903175944edf4fb0a9ed9913fdf164733d3f1e644ef469bc79b0d38a526ee620b92169cb40e79b40b0c716b
languageName: node
linkType: hard
"@sapphire/async-queue@npm:^1.1.9":
version: 1.1.9
resolution: "@sapphire/async-queue@npm:1.1.9"
checksum: 8a4cb79e01948ee9f99f47e9fdfdfd509353d267f9e18bb8fe8e813b5d45f1fb6de08297b4557eb9a76b95bea59abaab67819175238068cc4cbc808d1d183e9d
languageName: node
linkType: hard
"@sindresorhus/is@npm:^4.2.0":
version: 4.2.0
resolution: "@sindresorhus/is@npm:4.2.0"
checksum: 59040dfb75c2eb6ab76e8c7ac10b7f7f6ba740f0b5ac618a89a8bcdbaf923836a8e998078d59d81f6f13f4b6bbe15bfe1bca962c877edcbe9160d1c100c56fd7
languageName: node
linkType: hard
"@types/blessed@npm:^0.1.19":
version: 0.1.19
resolution: "@types/blessed@npm:0.1.19"
dependencies:
"@types/node": "*"
checksum: 255e6f5ffdfcea15400d01ee468585f04b72d0a263bd1972e9ae236157d24e5e01524591d751b992afe761a67b648bc296633935c6018425593175c7d055775d
languageName: node
linkType: hard
"@types/config@npm:^0.0.40":
version: 0.0.40
resolution: "@types/config@npm:0.0.40"
checksum: 94e52288d26895c25c6a00cb553f6a19d71e9edd7ecfe0a3f0689c486f559be6cbf400362f14fa0daac5b12bd30e876b8c6aafc5fbd37580c2c3270464c4af59
languageName: node
linkType: hard
"@types/node-fetch@npm:^2.5.12":
version: 2.5.12
resolution: "@types/node-fetch@npm:2.5.12"
dependencies:
"@types/node": "*"
form-data: ^3.0.0
checksum: ad63c85ba6a9477b8e057ec8682257738130d98e8ece4e31141789bd99df9d9147985cc8bc0cb5c8983ed5aa6bb95d46df23d1e055f4ad5cf8b82fc69cf626c7
languageName: node
linkType: hard
"@types/node@npm:*, @types/node@npm:^17.0.4":
version: 17.0.4
resolution: "@types/node@npm:17.0.4"
checksum: 92e6a25fea2314cd34e81962bd07c8b79b92cae04d84a0336a8c49a2b8aa4c34ff8cb428baeac2022daf597809bd3b7987c624b07a91c4d01b6230f82c293190
languageName: node
linkType: hard
"@types/ws@npm:^8.2.2":
version: 8.2.2
resolution: "@types/ws@npm:8.2.2"
dependencies:
"@types/node": "*"
checksum: 308957864b9a5a0378ac82f1b084fa31b1bbe85106fb0d84ed2b392e4829404f21ab6ab2c1eb782d556e59cd33d57c75ad2d0cedc4b9b9d0ca3b2311bc915578
languageName: node
linkType: hard
"abbrev@npm:1":
version: 1.1.1
resolution: "abbrev@npm:1.1.1"
checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17
languageName: node
linkType: hard
"ansi-escapes@npm:^4.3.1":
version: 4.3.2
resolution: "ansi-escapes@npm:4.3.2"
dependencies:
type-fest: ^0.21.3
checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815
languageName: node
linkType: hard
"ansi-regex@npm:^2.0.0":
version: 2.1.1
resolution: "ansi-regex@npm:2.1.1"
checksum: 190abd03e4ff86794f338a31795d262c1dfe8c91f7e01d04f13f646f1dcb16c5800818f886047876f1272f065570ab86b24b99089f8b68a0e11ff19aed4ca8f1
languageName: node
linkType: hard
"ansi-regex@npm:^5.0.1":
version: 5.0.1
resolution: "ansi-regex@npm:5.0.1"
checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b
languageName: node
linkType: hard
"ansi-styles@npm:^2.2.1":
version: 2.2.1
resolution: "ansi-styles@npm:2.2.1"
checksum: ebc0e00381f2a29000d1dac8466a640ce11943cef3bda3cd0020dc042e31e1058ab59bf6169cd794a54c3a7338a61ebc404b7c91e004092dd20e028c432c9c2c
languageName: node
linkType: hard
"ansi-styles@npm:^4.1.0":
version: 4.3.0
resolution: "ansi-styles@npm:4.3.0"
dependencies:
color-convert: ^2.0.1
checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4
languageName: node
linkType: hard
"ansi-term@npm:>=0.0.2":
version: 0.0.2
resolution: "ansi-term@npm:0.0.2"
dependencies:
x256: ">=0.0.1"
checksum: 01123e07bdd8b25dac67ed5c7b374db629966dc57127eaedd708a18cbebab4e42abfb133d372609ae85dc45e2a71e16ea69c96236b61f11a2acff9ead743ba76
languageName: node
linkType: hard
"ansicolors@npm:~0.3.2":
version: 0.3.2
resolution: "ansicolors@npm:0.3.2"
checksum: e84fae7ebc27ac96d9dbb57f35f078cd6dde1b7046b0f03f73dcefc9fbb1f2e82e3685d083466aded8faf038f9fa9ebb408d215282bcd7aaa301d5ac3c486815
languageName: node
linkType: hard
"asynckit@npm:^0.4.0":
version: 0.4.0
resolution: "asynckit@npm:0.4.0"
checksum: 7b78c451df768adba04e2d02e63e2d0bf3b07adcd6e42b4cf665cb7ce899bedd344c69a1dcbce355b5f972d597b25aaa1c1742b52cffd9caccb22f348114f6be
languageName: node
linkType: hard
"axios@npm:^0.24.0":
version: 0.24.0
resolution: "axios@npm:0.24.0"
dependencies:
follow-redirects: ^1.14.4
checksum: 468cf496c08a6aadfb7e699bebdac02851e3043d4e7d282350804ea8900e30d368daa6e3cd4ab83b8ddb5a3b1e17a5a21ada13fc9cebd27b74828f47a4236316
languageName: node
linkType: hard
"blessed-contrib@npm:^4.10.1":
version: 4.10.1
resolution: "blessed-contrib@npm:4.10.1"
dependencies:
ansi-term: ">=0.0.2"
chalk: ^1.1.0
drawille-canvas-blessed-contrib: ">=0.1.3"
lodash: ~>=4.17.21
map-canvas: ">=0.1.5"
marked: ^2.1.1
marked-terminal: ^4.1.1
memory-streams: ^0.1.0
memorystream: ^0.3.1
picture-tuber: ^1.0.1
sparkline: ^0.1.1
strip-ansi: ^3.0.0
term-canvas: 0.0.5
x256: ">=0.0.1"
checksum: 26e6c72c30852d91eb4bbcebadfd26a543d987781ec26ef365f4dd8a2a55b120f72e3e477941af83b471d6ca5e2c373371f49ca5f76902d053e7b3f3923e5023
languageName: node
linkType: hard
"blessed@npm:^0.1.81":
version: 0.1.81
resolution: "blessed@npm:0.1.81"
bin:
blessed: ./bin/tput.js
checksum: a8f96978cc8e3e5ac887c43df8523074ba4352b9a055d8b078c60ae1f9f62837c9eb620e5fc78ccbb005119167234fcf788915a16428c1c397a7fbf9f630b42c
languageName: node
linkType: hard
"bresenham@npm:0.0.3":
version: 0.0.3
resolution: "bresenham@npm:0.0.3"
checksum: f40703d57d1587aa1b0923c016c5fa1fcc354c5b49cbb205e613c223b9e09a4dd80cd990c3cc112ae4ff6704195b0255f9d677c2e8b199545f058b396f52706c
languageName: node
linkType: hard
"buffers@npm:~0.1.1":
version: 0.1.1
resolution: "buffers@npm:0.1.1"
checksum: ad6f8e483efab39cefd92bdc04edbff6805e4211b002f4d1cfb70c6c472a61cc89fb18c37bcdfdd4ee416ca096e9ff606286698a7d41a18b539bac12fd76d4d5
languageName: node
linkType: hard
"cardinal@npm:^2.1.1":
version: 2.1.1
resolution: "cardinal@npm:2.1.1"
dependencies:
ansicolors: ~0.3.2
redeyed: ~2.1.0
bin:
cdl: ./bin/cdl.js
checksum: e8d4ae46439cf8fed481c0efd267711ee91e199aa7821a9143e784ed94a6495accd01a0b36d84d377e8ee2cc9928a6c9c123b03be761c60b805f2c026b8a99ad
languageName: node
linkType: hard
"chalk@npm:^1.1.0":
version: 1.1.3
resolution: "chalk@npm:1.1.3"
dependencies:
ansi-styles: ^2.2.1
escape-string-regexp: ^1.0.2
has-ansi: ^2.0.0
strip-ansi: ^3.0.0
supports-color: ^2.0.0
checksum: 9d2ea6b98fc2b7878829eec223abcf404622db6c48396a9b9257f6d0ead2acf18231ae368d6a664a83f272b0679158da12e97b5229f794939e555cc574478acd
languageName: node
linkType: hard
"chalk@npm:^4.1.0":
version: 4.1.2
resolution: "chalk@npm:4.1.2"
dependencies:
ansi-styles: ^4.1.0
supports-color: ^7.1.0
checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc
languageName: node
linkType: hard
"charm@npm:~0.1.0":
version: 0.1.2
resolution: "charm@npm:0.1.2"
checksum: fe64983d7a87e7dacf225bd1fc10d34554110e128d3f3b8a91cfefb370b92211d0f1f7a9ff43df3ccfcb81d7f91525750b998519ab6b8e3c9dd249a3529ad783
languageName: node
linkType: hard
"chord@workspace:.":
version: 0.0.0-use.local
resolution: "chord@workspace:."
dependencies:
"@types/blessed": ^0.1.19
"@types/config": ^0.0.40
"@types/node": ^17.0.4
"@types/ws": ^8.2.2
axios: ^0.24.0
blessed: ^0.1.81
blessed-contrib: ^4.10.1
config: ^3.3.6
discord.js: "https://github.com/Relms12345/discord.js.git#commit=f792a34bf7925cbf74e4c5799b74b66da93b3d5f"
typescript: ^4.5.4
ws: ^8.4.0
languageName: unknown
linkType: soft
"cli-table3@npm:^0.6.0":
version: 0.6.0
resolution: "cli-table3@npm:0.6.0"
dependencies:
colors: ^1.1.2
object-assign: ^4.1.0
string-width: ^4.2.0
dependenciesMeta:
colors:
optional: true
checksum: 98682a2d3eef5ad07d34a08f90398d0640004e28ecf8eb59006436f11ed7b4d453db09f46c2ea880618fbd61fee66321b3b3ee1b20276bc708b6baf6f9663d75
languageName: node
linkType: hard
"color-convert@npm:^2.0.1":
version: 2.0.1
resolution: "color-convert@npm:2.0.1"
dependencies:
color-name: ~1.1.4
checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336
languageName: node
linkType: hard
"color-name@npm:~1.1.4":
version: 1.1.4
resolution: "color-name@npm:1.1.4"
checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610
languageName: node
linkType: hard
"colors@npm:^1.1.2":
version: 1.4.0
resolution: "colors@npm:1.4.0"
checksum: 98aa2c2418ad87dedf25d781be69dc5fc5908e279d9d30c34d8b702e586a0474605b3a189511482b9d5ed0d20c867515d22749537f7bc546256c6014f3ebdcec
languageName: node
linkType: hard
"combined-stream@npm:^1.0.8":
version: 1.0.8
resolution: "combined-stream@npm:1.0.8"
dependencies:
delayed-stream: ~1.0.0
checksum: 49fa4aeb4916567e33ea81d088f6584749fc90c7abec76fd516bf1c5aa5c79f3584b5ba3de6b86d26ddd64bae5329c4c7479343250cfe71c75bb366eae53bb7c
languageName: node
linkType: hard
"config@npm:^3.3.6":
version: 3.3.6
resolution: "config@npm:3.3.6"
dependencies:
json5: ^2.1.1
checksum: 53684cae0d1c9fa2fe6db41fa85201aa5ab92dcbe7596d63381e7e48f0cb3dea45bee812dc18ee91a3daf887ec0f3c57bf4acc555629ba7608d5a3b932e61c8e
languageName: node
linkType: hard
"core-util-is@npm:~1.0.0":
version: 1.0.3
resolution: "core-util-is@npm:1.0.3"
checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99
languageName: node
linkType: hard
"delayed-stream@npm:~1.0.0":
version: 1.0.0
resolution: "delayed-stream@npm:1.0.0"
checksum: 46fe6e83e2cb1d85ba50bd52803c68be9bd953282fa7096f51fc29edd5d67ff84ff753c51966061e5ba7cb5e47ef6d36a91924eddb7f3f3483b1c560f77a0020
languageName: node
linkType: hard
"discord-api-types@npm:^0.26.0":
version: 0.26.0
resolution: "discord-api-types@npm:0.26.0"
checksum: 5c2a3f7309fec3830a8da5e98e5260b25304512ae856c770d783492aa4a8c514a64025bb30ceda0c4381bc749db9545c0d7d5573fa0d60bb1718add27c8b4d7d
languageName: node
linkType: hard
"discord.js@https://github.com/Relms12345/discord.js.git#commit=f792a34bf7925cbf74e4c5799b74b66da93b3d5f":
version: 14.0.0-dev
resolution: "discord.js@https://github.com/Relms12345/discord.js.git#commit=f792a34bf7925cbf74e4c5799b74b66da93b3d5f"
dependencies:
"@discordjs/builders": ^0.11.0
"@discordjs/collection": ^0.4.0
"@sapphire/async-queue": ^1.1.9
"@types/node-fetch": ^2.5.12
"@types/ws": ^8.2.2
discord-api-types: ^0.26.0
form-data: ^4.0.0
node-fetch: ^2.6.1
ws: ^8.4.0
checksum: 1eb73a1f33f1706766112c4011c726b9fc5cd2d2e3655cb245f59f713033238a139c44275ec9f96f7b23d1e9bc38cf466d19277a5fb45526e9ea0fb05cfd823d
languageName: node
linkType: hard
"drawille-blessed-contrib@npm:>=0.0.1":
version: 1.0.0
resolution: "drawille-blessed-contrib@npm:1.0.0"
checksum: 824f2c78ea588d8b11ccc302a9855e53182b1d9f9695dc07ffab845e832fbfc3253ca996c5dcc10e671bbed9715f2daaf179ccba8860c8df2b10c4ae83ec2ddc
languageName: node
linkType: hard
"drawille-canvas-blessed-contrib@npm:>=0.0.1, drawille-canvas-blessed-contrib@npm:>=0.1.3":
version: 0.1.3
resolution: "drawille-canvas-blessed-contrib@npm:0.1.3"
dependencies:
ansi-term: ">=0.0.2"
bresenham: 0.0.3
drawille-blessed-contrib: ">=0.0.1"
gl-matrix: ^2.1.0
x256: ">=0.0.1"
checksum: 953416dc624185ed05a63ea2716010236828f964cc862578029d3e16b3a4b14e3018153f802c7b9f596957b307aa3c2ad190f64a00e7ff74f1c4b84d095864a7
languageName: node
linkType: hard
"emoji-regex@npm:^8.0.0":
version: 8.0.0
resolution: "emoji-regex@npm:8.0.0"
checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192
languageName: node
linkType: hard
"escape-string-regexp@npm:^1.0.2":
version: 1.0.5
resolution: "escape-string-regexp@npm:1.0.5"
checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410
languageName: node
linkType: hard
"esprima@npm:~4.0.0":
version: 4.0.1
resolution: "esprima@npm:4.0.1"
bin:
esparse: ./bin/esparse.js
esvalidate: ./bin/esvalidate.js
checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628
languageName: node
linkType: hard
"event-stream@npm:~0.9.8":
version: 0.9.8
resolution: "event-stream@npm:0.9.8"
dependencies:
optimist: 0.2
checksum: 526b7f0365377727357b03b677a55a7177c1a2138121b293d0b864889a67f470d8317d6979993b1a0c79ace1a24b453d0a5763f60c528768bb2437b6010be229
languageName: node
linkType: hard
"follow-redirects@npm:^1.14.4":
version: 1.14.6
resolution: "follow-redirects@npm:1.14.6"
peerDependenciesMeta:
debug:
optional: true
checksum: 7fcdb089a733d2aa39041880790e9f772df009fcd0b243fee7e10acf0e14a8dab5208cf79eb1de35b9cc6033d4dde7f95becadfaa360c50d460b4c730b375e80
languageName: node
linkType: hard
"form-data@npm:^3.0.0":
version: 3.0.1
resolution: "form-data@npm:3.0.1"
dependencies:
asynckit: ^0.4.0
combined-stream: ^1.0.8
mime-types: ^2.1.12
checksum: b019e8d35c8afc14a2bd8a7a92fa4f525a4726b6d5a9740e8d2623c30e308fbb58dc8469f90415a856698933c8479b01646a9dff33c87cc4e76d72aedbbf860d
languageName: node
linkType: hard
"form-data@npm:^4.0.0":
version: 4.0.0
resolution: "form-data@npm:4.0.0"
dependencies:
asynckit: ^0.4.0
combined-stream: ^1.0.8
mime-types: ^2.1.12
checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c
languageName: node
linkType: hard
"gl-matrix@npm:^2.1.0":
version: 2.8.1
resolution: "gl-matrix@npm:2.8.1"
checksum: 20d13fd428ea3021d625781e025132ff8ec264f4c05310bda9ad859535ab32fb505323486d2d5c51b5f715c2a9d059da588b66e8e2afdafdf1acc4f45629b7ff
languageName: node
linkType: hard
"has-ansi@npm:^2.0.0":
version: 2.0.0
resolution: "has-ansi@npm:2.0.0"
dependencies:
ansi-regex: ^2.0.0
checksum: 1b51daa0214440db171ff359d0a2d17bc20061164c57e76234f614c91dbd2a79ddd68dfc8ee73629366f7be45a6df5f2ea9de83f52e1ca24433f2cc78c35d8ec
languageName: node
linkType: hard
"has-flag@npm:^4.0.0":
version: 4.0.0
resolution: "has-flag@npm:4.0.0"
checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad
languageName: node
linkType: hard
"here@npm:0.0.2":
version: 0.0.2
resolution: "here@npm:0.0.2"
checksum: 73531438cfe6919a12d350fdaa356d18b8ed6479a4bdeaa05d7fb91dafd9ff52d0c4bd41eb28c92bf27631da1f52f7c7c7a75263600686983f2c4b9d06833d60
languageName: node
linkType: hard
"inherits@npm:~2.0.1":
version: 2.0.4
resolution: "inherits@npm:2.0.4"
checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1
languageName: node
linkType: hard
"is-fullwidth-code-point@npm:^3.0.0":
version: 3.0.0
resolution: "is-fullwidth-code-point@npm:3.0.0"
checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348
languageName: node
linkType: hard
"isarray@npm:0.0.1":
version: 0.0.1
resolution: "isarray@npm:0.0.1"
checksum: 49191f1425681df4a18c2f0f93db3adb85573bcdd6a4482539d98eac9e705d8961317b01175627e860516a2fc45f8f9302db26e5a380a97a520e272e2a40a8d4
languageName: node
linkType: hard
"json5@npm:^2.1.1":
version: 2.2.0
resolution: "json5@npm:2.2.0"
dependencies:
minimist: ^1.2.5
bin:
json5: lib/cli.js
checksum: e88fc5274bb58fc99547baa777886b069d2dd96d9cfc4490b305fd16d711dabd5979e35a4f90873cefbeb552e216b041a304fe56702bedba76e19bc7845f208d
languageName: node
linkType: hard
"lodash@npm:^4.17.21, lodash@npm:~>=4.17.21":
version: 4.17.21
resolution: "lodash@npm:4.17.21"
checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7
languageName: node
linkType: hard
"map-canvas@npm:>=0.1.5":
version: 0.1.5
resolution: "map-canvas@npm:0.1.5"
dependencies:
drawille-canvas-blessed-contrib: ">=0.0.1"
xml2js: ^0.4.5
checksum: 95f006e722a1de3e7639797db311ca7587d10fb2503c887151ee7d409bd0650b1250af449d2e943cb4444c4a24ccf50f92ccf5babbf7d7b2a99363b7e5d135ac
languageName: node
linkType: hard
"marked-terminal@npm:^4.1.1":
version: 4.2.0
resolution: "marked-terminal@npm:4.2.0"
dependencies:
ansi-escapes: ^4.3.1
cardinal: ^2.1.1
chalk: ^4.1.0
cli-table3: ^0.6.0
node-emoji: ^1.10.0
supports-hyperlinks: ^2.1.0
peerDependencies:
marked: ^1.0.0 || ^2.0.0
checksum: a68a4cfd22b42f990a82e3234c68006ab4d1285a4a9bdd162f597740d9a55275c10c78ca21fa3927a76b2197589fe382e33af9baa2ccb2153812986c15aa73b8
languageName: node
linkType: hard
"marked@npm:^2.1.1":
version: 2.1.3
resolution: "marked@npm:2.1.3"
bin:
marked: bin/marked
checksum: 21a5ecd4941bc760aba21dfd97185853ec3b464cf707ad971e3ddb3aeb2f44d0deeb36b0889932afdb6f734975a994d92f18815dd0fabadbd902bdaff997cc5b
languageName: node
linkType: hard
"memory-streams@npm:^0.1.0":
version: 0.1.3
resolution: "memory-streams@npm:0.1.3"
dependencies:
readable-stream: ~1.0.2
checksum: aebb6dc54c35ff8e7fcbbffc736ae95938d9bb7ed66735b693ed18743fcc6268f64eaa80b2580a49c3c73ddc00cd880d5847f318997affe6d2a46b75365715f8
languageName: node
linkType: hard
"memorystream@npm:^0.3.1":
version: 0.3.1
resolution: "memorystream@npm:0.3.1"
checksum: f18b42440d24d09516d01466c06adf797df7873f0d40aa7db02e5fb9ed83074e5e65412d0720901d7069363465f82dc4f8bcb44f0cde271567a61426ce6ca2e9
languageName: node
linkType: hard
"mime-db@npm:1.51.0":
version: 1.51.0
resolution: "mime-db@npm:1.51.0"
checksum: 613b1ac9d6e725cc24444600b124a7f1ce6c60b1baa654f39a3e260d0995a6dffc5693190217e271af7e2a5612dae19f2a73f3e316707d797a7391165f7ef423
languageName: node
linkType: hard
"mime-types@npm:^2.1.12":
version: 2.1.34
resolution: "mime-types@npm:2.1.34"
dependencies:
mime-db: 1.51.0
checksum: 67013de9e9d6799bde6d669d18785b7e18bcd212e710d3e04a4727f92f67a8ad4e74aee24be28b685adb794944814bde649119b58ee3282ffdbee58f9278d9f3
languageName: node
linkType: hard
"minimist@npm:^1.2.5":
version: 1.2.5
resolution: "minimist@npm:1.2.5"
checksum: 86706ce5b36c16bfc35c5fe3dbb01d5acdc9a22f2b6cc810b6680656a1d2c0e44a0159c9a3ba51fb072bb5c203e49e10b51dcd0eec39c481f4c42086719bae52
languageName: node
linkType: hard
"node-emoji@npm:^1.10.0":
version: 1.11.0
resolution: "node-emoji@npm:1.11.0"
dependencies:
lodash: ^4.17.21
checksum: e8c856c04a1645062112a72e59a98b203505ed5111ff84a3a5f40611afa229b578c7d50f1e6a7f17aa62baeea4a640d2e2f61f63afc05423aa267af10977fb2b
languageName: node
linkType: hard
"node-fetch@npm:^2.6.1":
version: 2.6.6
resolution: "node-fetch@npm:2.6.6"
dependencies:
whatwg-url: ^5.0.0
checksum: ee8290626bdb73629c59722b75dcf4b9b6a67c1ed7eb9102e368479c4a13b56a48c2bb3ad71571e378e98c8b2c64c820e11f9cd39e4b8557dd138ad571ef9a42
languageName: node
linkType: hard
"nopt@npm:~2.1.2":
version: 2.1.2
resolution: "nopt@npm:2.1.2"
dependencies:
abbrev: 1
bin:
nopt: ./bin/nopt.js
checksum: eb7bf965c0117d537f1859b5da1d33cf3d48c63fa4c7f95ed1356fa07323ea5938878cf6bd511b7c6240c21a3b3f079066398c1d26dd9e2eb6235d0963013b7f
languageName: node
linkType: hard
"object-assign@npm:^4.1.0":
version: 4.1.1
resolution: "object-assign@npm:4.1.1"
checksum: fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f
languageName: node
linkType: hard
"optimist@npm:0.2":
version: 0.2.8
resolution: "optimist@npm:0.2.8"
dependencies:
wordwrap: ">=0.0.1 <0.1.0"
checksum: e43cbf95b9005f38bc6a47eeede5cecbac0617cb15405ca29aa79891d1ef31053936e8b596eaf0e0d5d40c24a57ea810c06b82daddcd3f949311ef4699e62eb3
languageName: node
linkType: hard
"optimist@npm:~0.3.4":
version: 0.3.7
resolution: "optimist@npm:0.3.7"
dependencies:
wordwrap: ~0.0.2
checksum: adc02acb8b76d242e56714b47c8c96916b25a5ac2da7b9f735e1f946a970f266f71d53eff0b61d9582ef948301e94734f03b784fa7c309aed0fe7db403d22046
languageName: node
linkType: hard
"picture-tuber@npm:^1.0.1":
version: 1.0.2
resolution: "picture-tuber@npm:1.0.2"
dependencies:
buffers: ~0.1.1
charm: ~0.1.0
event-stream: ~0.9.8
optimist: ~0.3.4
png-js: ~0.1.0
x256: ~0.0.1
bin:
picture-tube: bin/tube.js
checksum: 309138d032b3f638af27091a526507ad725c64fc2cab3033dca1b9cb0f0ee7c89de3691ebb77198cc70f9b785990d7cb649db06bcd1d9c275861869c6d9b3fea
languageName: node
linkType: hard
"png-js@npm:~0.1.0":
version: 0.1.1
resolution: "png-js@npm:0.1.1"
checksum: 755d025d5e0f02f82f07627a6bcf9c7d2bcdaeb5aa8372953a9cb515a84883b664439931ec1e397eb7d696920cc6c9e70afcedf90d3e889cd9163afab64c71f4
languageName: node
linkType: hard
"readable-stream@npm:~1.0.2":
version: 1.0.34
resolution: "readable-stream@npm:1.0.34"
dependencies:
core-util-is: ~1.0.0
inherits: ~2.0.1
isarray: 0.0.1
string_decoder: ~0.10.x
checksum: 85042c537e4f067daa1448a7e257a201070bfec3dd2706abdbd8ebc7f3418eb4d3ed4b8e5af63e2544d69f88ab09c28d5da3c0b77dc76185fddd189a59863b60
languageName: node
linkType: hard
"redeyed@npm:~2.1.0":
version: 2.1.1
resolution: "redeyed@npm:2.1.1"
dependencies:
esprima: ~4.0.0
checksum: 39a1426e377727cfb47a0e24e95c1cf78d969fbc388dc1e0fa1e2ef8a8756450cefb8b0c2598f63b85f1a331986fca7604c0db798427a5775a1dbdb9c1291979
languageName: node
linkType: hard
"sax@npm:>=0.6.0":
version: 1.2.4
resolution: "sax@npm:1.2.4"
checksum: d3df7d32b897a2c2f28e941f732c71ba90e27c24f62ee918bd4d9a8cfb3553f2f81e5493c7f0be94a11c1911b643a9108f231dd6f60df3fa9586b5d2e3e9e1fe
languageName: node
linkType: hard
"sparkline@npm:^0.1.1":
version: 0.1.2
resolution: "sparkline@npm:0.1.2"
dependencies:
here: 0.0.2
nopt: ~2.1.2
bin:
sparkline: bin/sparkline
checksum: 7fab1c94ca2aaa036aa213784df6431a5876cfe5eb9f3442407bc0086aa9e146e89437c39c530d7c408fc0c368b294c135d8c884a716039b53bbb617917f876c
languageName: node
linkType: hard
"string-width@npm:^4.2.0":
version: 4.2.3
resolution: "string-width@npm:4.2.3"
dependencies:
emoji-regex: ^8.0.0
is-fullwidth-code-point: ^3.0.0
strip-ansi: ^6.0.1
checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb
languageName: node
linkType: hard
"string_decoder@npm:~0.10.x":
version: 0.10.31
resolution: "string_decoder@npm:0.10.31"
checksum: fe00f8e303647e5db919948ccb5ce0da7dea209ab54702894dd0c664edd98e5d4df4b80d6fabf7b9e92b237359d21136c95bf068b2f7760b772ca974ba970202
languageName: node
linkType: hard
"strip-ansi@npm:^3.0.0":
version: 3.0.1
resolution: "strip-ansi@npm:3.0.1"
dependencies:
ansi-regex: ^2.0.0
checksum: 9b974de611ce5075c70629c00fa98c46144043db92ae17748fb780f706f7a789e9989fd10597b7c2053ae8d1513fd707816a91f1879b2f71e6ac0b6a863db465
languageName: node
linkType: hard
"strip-ansi@npm:^6.0.1":
version: 6.0.1
resolution: "strip-ansi@npm:6.0.1"
dependencies:
ansi-regex: ^5.0.1
checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c
languageName: node
linkType: hard
"supports-color@npm:^2.0.0":
version: 2.0.0
resolution: "supports-color@npm:2.0.0"
checksum: 602538c5812b9006404370b5a4b885d3e2a1f6567d314f8b4a41974ffe7d08e525bf92ae0f9c7030e3b4c78e4e34ace55d6a67a74f1571bc205959f5972f88f0
languageName: node
linkType: hard
"supports-color@npm:^7.0.0, supports-color@npm:^7.1.0":
version: 7.2.0
resolution: "supports-color@npm:7.2.0"
dependencies:
has-flag: ^4.0.0
checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a
languageName: node
linkType: hard
"supports-hyperlinks@npm:^2.1.0":
version: 2.2.0
resolution: "supports-hyperlinks@npm:2.2.0"
dependencies:
has-flag: ^4.0.0
supports-color: ^7.0.0
checksum: aef04fb41f4a67f1bc128f7c3e88a81b6cf2794c800fccf137006efe5bafde281da3e42e72bf9206c2fcf42e6438f37e3a820a389214d0a88613ca1f2d36076a
languageName: node
linkType: hard
"term-canvas@npm:0.0.5":
version: 0.0.5
resolution: "term-canvas@npm:0.0.5"
checksum: 36408f75257e8ae8d79c075c04e0b0367a89da5868f8bdc534bef6d4f1f6ca1492bb17a4f9b7c7c9ecfe8a415e3806d27b0be511696a1a99de10c3f9b72ca80c
languageName: node
linkType: hard
"tr46@npm:~0.0.3":
version: 0.0.3
resolution: "tr46@npm:0.0.3"
checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3
languageName: node
linkType: hard
"ts-mixer@npm:^6.0.0":
version: 6.0.0
resolution: "ts-mixer@npm:6.0.0"
checksum: 791a513c9ca318a979928f5265fd6029858fa21595153a9386063c11239a6b1c352db1e277c19f0544d017a67cf78d120a7438b86b2c828b1115eb607538eff8
languageName: node
linkType: hard
"tslib@npm:^2.3.1":
version: 2.3.1
resolution: "tslib@npm:2.3.1"
checksum: de17a98d4614481f7fcb5cd53ffc1aaf8654313be0291e1bfaee4b4bb31a20494b7d218ff2e15017883e8ea9626599b3b0e0229c18383ba9dce89da2adf15cb9
languageName: node
linkType: hard
"type-fest@npm:^0.21.3":
version: 0.21.3
resolution: "type-fest@npm:0.21.3"
checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0
languageName: node
linkType: hard
"typescript@npm:^4.5.4":
version: 4.5.4
resolution: "typescript@npm:4.5.4"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 59f3243f9cd6fe3161e6150ff6bf795fc843b4234a655dbd938a310515e0d61afd1ac942799e7415e4334255e41c2c49b7dd5d9fd38a17acd25a6779ca7e0961
languageName: node
linkType: hard
"typescript@patch:typescript@^4.5.4#~builtin<compat/typescript>":
version: 4.5.4
resolution: "typescript@patch:typescript@npm%3A4.5.4#~builtin<compat/typescript>::version=4.5.4&hash=493e53"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
checksum: 2e488dde7d2c4a2fa2e79cf2470600f8ce81bc0563c276b72df8ff412d74456ae532ba824650ae936ce207440c79720ddcfaa25e3cb4477572b8534fa4e34d49
languageName: node
linkType: hard
"webidl-conversions@npm:^3.0.0":
version: 3.0.1
resolution: "webidl-conversions@npm:3.0.1"
checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c
languageName: node
linkType: hard
"whatwg-url@npm:^5.0.0":
version: 5.0.0
resolution: "whatwg-url@npm:5.0.0"
dependencies:
tr46: ~0.0.3
webidl-conversions: ^3.0.0
checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c
languageName: node
linkType: hard
"wordwrap@npm:>=0.0.1 <0.1.0, wordwrap@npm:~0.0.2":
version: 0.0.3
resolution: "wordwrap@npm:0.0.3"
checksum: dfc2d3512e857ae4b3bc2e8d4e5d2c285c28a4b87cd1d81c977ce9a1a99152d355807e046851a3d61148f39d877fbb889352e07b65a9cbdd2256aa928e159026
languageName: node
linkType: hard
"ws@npm:^8.4.0":
version: 8.4.0
resolution: "ws@npm:8.4.0"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
checksum: 5e37ccf0ecb8d8019d88b07af079e8f74248b688ad3109ab57cd5e1c9a7392545f572914d0c27f25e8b83a6cfc09a89ac151c556ff4fae26d6f824077e4f8239
languageName: node
linkType: hard
"x256@npm:>=0.0.1, x256@npm:~0.0.1":
version: 0.0.2
resolution: "x256@npm:0.0.2"
checksum: 891a67c4f946f6aa95902e8ebbdafd54ab8fb5851b96fb7b303206a0400cad9e8ea4bc920ef91e98ec7e3af9c1cd8cc6fa205f9a0f0f4e619dcd82f1c1e38447
languageName: node
linkType: hard
"xml2js@npm:^0.4.5":
version: 0.4.23
resolution: "xml2js@npm:0.4.23"
dependencies:
sax: ">=0.6.0"
xmlbuilder: ~11.0.0
checksum: ca0cf2dfbf6deeaae878a891c8fbc0db6fd04398087084edf143cdc83d0509ad0fe199b890f62f39c4415cf60268a27a6aed0d343f0658f8779bd7add690fa98
languageName: node
linkType: hard
"xmlbuilder@npm:~11.0.0":
version: 11.0.1
resolution: "xmlbuilder@npm:11.0.1"
checksum: 7152695e16f1a9976658215abab27e55d08b1b97bca901d58b048d2b6e106b5af31efccbdecf9b07af37c8377d8e7e821b494af10b3a68b0ff4ae60331b415b0
languageName: node
linkType: hard
"zod@npm:^3.11.6":
version: 3.11.6
resolution: "zod@npm:3.11.6"
checksum: 044ac416450f179a0c88240f27849d2886c777cebade42df10e5f04125b0265cec82d9bd741a7dcb11796b2ea88b32c86be7d36932a4bed6af57002560359db1
languageName: node
linkType: hard