Archived
0
0
Fork 0

Compare commits

..

No commits in common. "71ae08bf108b48ff0d1ff65a9a763769b2a36d98" and "0e2ffa7e9a7226292c37838fa448e0440c818681" have entirely different histories.

16 changed files with 585 additions and 2421 deletions

6
.gitignore vendored
View file

@ -1,4 +1,2 @@
.yarn/cache bin
.yarn/install-state.gz obj
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

File diff suppressed because one or more lines are too long

View file

@ -1,11 +0,0 @@
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 Normal file
View file

@ -0,0 +1 @@
- 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.
backend <one line to give the program's name and a brief idea of what it does.>
Copyright (C) 2021 Furbook Copyright (C) <year> <name of author>
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) 2021 Furbook <program> Copyright (C) <year> <name of author>
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.

498
Program.cs Normal file
View file

@ -0,0 +1,498 @@
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; }
}

17
README.md Normal file
View file

@ -0,0 +1,17 @@
# 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 Normal file
View file

@ -0,0 +1,8 @@
- 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)

34
chord.csproj Normal file
View file

@ -0,0 +1,34 @@
<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>

22
chord.sln Normal file
View file

@ -0,0 +1,22 @@
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

View file

@ -1,36 +0,0 @@
{
"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"
}
}

View file

@ -1,289 +0,0 @@
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();

View file

@ -1,48 +0,0 @@
{
"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
View file

@ -1,890 +0,0 @@
# 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