34 Commits
Author SHA1 Message Date
Stone_Red 2b0765997a Update .gitignore 2021-08-06 21:46:23 +02:00
Stone-Red-Code 361859d2bc Remove debug files 2021-08-06 19:43:51 +02:00
Stone-Red-Code 881299c2d2 Preparation for the release of 0.0.5.0 step 2 2021-08-06 19:26:33 +02:00
Stone-Red-Code 4231256bfe Preparation for the release of 0.0.5.0 2021-08-06 19:25:52 +02:00
Stone-Red-Code 5bf354a22a Fixed update URL in update info path 2021-08-06 19:23:30 +02:00
Stone-Red-Code c7e4e89e17 Fixed version numbers in update info files 2021-08-06 19:19:00 +02:00
Stone-Red-Code 6186779115 Auto updater cross platform support test2 2021-08-06 19:17:21 +02:00
Stone-Red-Code 49d62348c8 Auto updater cross platform support test1 2021-08-06 18:57:20 +02:00
Stone-Red-Code db75f856ff Make userinfo command more reliable and some bug fixes 2021-08-03 23:05:43 +02:00
Stone-Red-Code 3d8d1d4709 Multiple bug fixes
Fixed:
URL detection regex
Application crashes when a message is sent in the read-only channel
Application does not exit correctly
2021-08-01 18:08:44 +02:00
Stone-Red-Code a1609916c2 Fixed mention higlighting and channels are now correctly sorted by chategory. 2021-08-01 17:18:26 +02:00
Stone-Red-Code d162cc0056 Updated AlwaysUpToDate to 1.0.04 2021-06-30 08:42:41 +02:00
Stone-Red-Code c63a480fe5 Added OnException Handler to the updater 2021-06-26 17:15:12 +02:00
Stone-Red-Code 45d5b51bab Cleanup 2021-06-18 08:59:26 +02:00
Stone-Red-Code 5a09767dbc Merge branch 'develop' of https://github.com/Stone-Red-Code/DiscordCLI into develop 2021-05-29 18:28:49 +02:00
Stone-Red-Code f900292d86 Added auto update 2021-05-29 18:27:50 +02:00
Stone_Red 95d3c4e476 Add files via upload 2021-05-29 18:19:12 +02:00
Stone_Red fb55a909f0 Add files via upload 2021-05-29 18:16:05 +02:00
Stone_Red b758cdab49 Update updateInfo.json 2021-05-29 18:04:45 +02:00
Stone_Red e9cde21189 Update updateInfo.json 2021-05-29 17:58:34 +02:00
Stone_Red d518f79263 Add files via upload 2021-05-29 17:54:57 +02:00
Stone-Red-Code 7fbfd85ff4 Auto update [Test 1] 2021-05-29 17:45:59 +02:00
Stone-Red-Code 16cee9413b Merge branch 'main' into develop 2021-05-28 19:57:31 +02:00
Stone-Red-Code 2265b044cc Added commands history
- Added commands history
- Added "clear" command
- Small code improvements
2021-05-28 19:54:42 +02:00
Stone-Red-Code d9143457a7 Updated file structure 2021-05-28 18:00:22 +02:00
Stone_Red 35db02685b Update issue templates 2021-05-28 17:52:23 +02:00
Stone-Red-Code af721731ea Better mention syntax highlighting and more
- Better mention syntax highlighting
- Added "userinfo" command
2021-05-28 16:47:56 +02:00
Stone_Red 652c81defa Update README.md 2021-05-27 18:13:05 +02:00
Stone-Red-Code 07ff5a6d4a Replaced .rar files through .zip files 2021-05-27 08:02:12 +02:00
Stone-Red-Code 57215db498 #2 DiscordCLI not sending capital letters. 2021-05-27 07:53:54 +02:00
Stone_Red 76845b9ae0 Update README.md 2021-05-01 20:41:58 +02:00
Stone_Red 31b4f9cc44 Update README.md 2021-04-16 12:00:23 +02:00
Stone_Red 524ed14b1f Update README.md 2021-04-14 14:36:49 +02:00
Stone_Red 8d93a9de2c Update README.md 2021-04-14 14:36:20 +02:00
282 changed files with 11004 additions and 4077 deletions
+32
View File
@@ -0,0 +1,32 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Desktop (please complete the following information):**
- OS: [e.g. iOS]
- Browser [e.g. chrome, safari]
- Version [e.g. 22]
**Additional context**
Add any other context about the problem here.
+20
View File
@@ -0,0 +1,20 @@
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
+365 -1
View File
@@ -1 +1,365 @@
*.txt
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# DiscordCLI-specific files
token.txt
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.obj
*.iobj
*.pch
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
Binary file not shown.
-187
View File
@@ -1,187 +0,0 @@
using DSharpPlus.Entities;
using DSharpPlus;
using Stone_Red_Utilities.ColorConsole;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System;
using System.Threading.Tasks;
namespace DiscordCLI
{
internal class Commands
{
private readonly DiscordClient client;
private readonly OutputManager outputManager;
public Commands(DiscordClient dicordClient, OutputManager outputMan)
{
client = dicordClient;
outputManager = outputMan;
}
protected async Task ListGuilds(string args)
{
int index = 1;
foreach (DiscordGuild guild in client.Guilds.Values)
{
Console.WriteLine($"{index}. {guild.Name}");
index++;
}
await Task.CompletedTask;
}
protected async Task ListDms(string args)
{
int index = 1;
foreach (DiscordDmChannel dmChannel in client.PrivateChannels)
{
Console.WriteLine($"{index}. {string.Join(", ", dmChannel.Recipients.Select(x => x.Username))}");
index++;
}
await Task.CompletedTask;
}
protected async Task ListGuildChannels(string args)
{
IReadOnlyCollection<DiscordChannel> textChannels;
DiscordGuild guild;
if (args != null)
{
if (int.TryParse(args, out int ind))
{
guild = client.Guilds?.Values.ElementAtOrDefault(ind - 1);
}
else
{
guild = client.Guilds?.FirstOrDefault(x => x.Value.Name == args).Value;
}
GlobalInformation.currentTextChannel = null;
}
else
{
guild = GlobalInformation.currentGuild;
}
if (guild is null)
{
ConsoleExt.WriteLine("Guild not found!", ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
return;
}
GlobalInformation.currentGuild = guild;
textChannels = guild.Channels;
int index = 1;
foreach (DiscordChannel channel in textChannels)
{
switch (channel.Type)
{
case ChannelType.Category:
//Console.WriteLine($"[{channel.Name}]");
break;
case ChannelType.Text:
Console.WriteLine($" {index}. {channel.Name}");
index++;
break;
}
}
await Task.CompletedTask;
}
protected async Task EnterChannel(string args)
{
DiscordChannel textChannel;
if (GlobalInformation.currentGuild is null)
{
ConsoleExt.WriteLine("You are not in a guild!", ConsoleColor.Red);
return;
}
if (int.TryParse(args, out int ind))
{
textChannel = GlobalInformation.currentGuild?.Channels.Where(x => x.Type == ChannelType.Text).ElementAtOrDefault(ind - 1);
}
else
{
textChannel = GlobalInformation.currentGuild?.Channels.Where(x => x.Type == ChannelType.Text).FirstOrDefault(x => x.Name == args);
}
GlobalInformation.currentTextChannel = textChannel;
if (textChannel is null)
{
ConsoleExt.WriteLine("Channel not found!", ConsoleColor.Red);
return;
}
try
{
foreach (DiscordMessage message in (textChannel.GetMessagesAsync(10).Result).Reverse())
{
await outputManager.WriteMessage(message, textChannel, GlobalInformation.currentGuild, false);
}
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex.Message, ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
}
await Task.CompletedTask;
}
protected async Task EnterDmChannel(string args)
{
DiscordDmChannel dmChannel;
GlobalInformation.currentGuild = null;
if (int.TryParse(args, out int ind))
{
dmChannel = client.PrivateChannels.ElementAtOrDefault(ind - 1);
}
else
{
dmChannel = client.PrivateChannels.FirstOrDefault(x => x.Name == args);
}
GlobalInformation.currentTextChannel = dmChannel;
if (dmChannel is null)
{
ConsoleExt.WriteLine("Channel not found!", ConsoleColor.Red);
return;
}
try
{
foreach (DiscordMessage message in (await dmChannel.GetMessagesAsync(10)).Reverse())
{
await outputManager.WriteMessage(message, dmChannel, GlobalInformation.currentGuild, false);
}
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex, ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
}
}
protected async Task DeleteToken(string args)
{
File.Delete(Program.tokenPath);
Environment.Exit(0);
await Task.CompletedTask;
}
}
}
-76
View File
@@ -1,76 +0,0 @@
using DSharpPlus;
using Stone_Red_Utilities.ColorConsole;
using System.IO;
using System.Threading.Tasks;
using System;
namespace DiscordCLI
{
internal class Program
{
public static void Main() => new Program().MainAsync().GetAwaiter().GetResult();
private DiscordClient client;
private InputManager inputManager;
private OutputManager outputManager;
private CommandsManager commandsManager;
public const string tokenPath = "token.txt";
public async Task MainAsync()
{
Console.ForegroundColor = ConsoleColor.White;
Console.OutputEncoding = System.Text.Encoding.UTF8;
string token = string.Empty;
if (File.Exists(tokenPath))
token = File.ReadAllText(tokenPath);
tokenInput:
while (string.IsNullOrWhiteSpace(token))
{
Console.Write("Enter auth token: ");
token = Console.ReadLine();
}
File.WriteAllText(tokenPath, token);
try
{
client = new DiscordClient(new DiscordConfiguration()
{
Token = token,
TokenType = TokenType.User,
});
client.MessageCreated += Client_MessageCreated;
await client.ConnectAsync();
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex, ConsoleColor.Red);
if (ex.Message.Contains("Authentication failed"))
{
File.Delete(tokenPath);
token = string.Empty;
goto tokenInput;
}
return;
}
outputManager = new OutputManager(client);
commandsManager = new CommandsManager(client, outputManager);
inputManager = new InputManager(client, commandsManager);
outputManager.InputManager = inputManager;
await inputManager.ReadInput();
}
private async Task Client_MessageCreated(DSharpPlus.EventArgs.MessageCreateEventArgs e)
{
await outputManager.WriteMessage(e.Message, e.Channel, e.Guild);
}
}
}
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
</Project>
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
Binary file not shown.
@@ -1,9 +0,0 @@
{
"runtimeOptions": {
"tfm": "netcoreapp3.1",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "3.1.0"
}
}
}
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,9 +0,0 @@
{
"runtimeOptions": {
"additionalProbingPaths": [
"C:\\Users\\David\\.dotnet\\store\\|arch|\\|tfm|",
"C:\\Users\\David\\.nuget\\packages",
"C:\\Microsoft\\Xamarin\\NuGet"
]
}
}
Binary file not shown.
Binary file not shown.
File diff suppressed because it is too large Load Diff
@@ -1,9 +0,0 @@
{
"runtimeOptions": {
"tfm": "net5.0",
"framework": {
"name": "Microsoft.NETCore.App",
"version": "5.0.0"
}
}
}
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
d74c436d6f045a94c6aefe230b53cf4fbca29cc5
Binary file not shown.
@@ -1 +0,0 @@
3e2c7be251ce3e62a6541dac29e1895e802a69f2
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
b19e6f37bddcbdb1df945fddaf2581ec8ab2932c
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
6b3b4647b7644f9b16fb8ec3b15a9fe904531b35
Binary file not shown.
@@ -1 +0,0 @@
3e2c7be251ce3e62a6541dac29e1895e802a69f2
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
8dbf5d9b5cf6fb65f2290f681f68bfa7a21560cd
@@ -1 +0,0 @@
94d569a53a5ac292d10f2db736ac10f01f735125
@@ -1 +0,0 @@
70e9524befa3e92045c7c316dc8b56aab9375e23
Binary file not shown.
Binary file not shown.
@@ -1 +0,0 @@
8dbf5d9b5cf6fb65f2290f681f68bfa7a21560cd
+56 -26
View File
@@ -1,57 +1,87 @@
# DiscordCLI
> Use Discord in the terminal
## Warning
**Use this software at your own risk!**\
This isn't directly a selfbot, but Discord may count it as User account automation and this is against their TOS.\
I guess everything should be fine as long as you don't behave conspicuously but still proceed with caution!\
Currently there are no known cases where a user got banned for using this software.\
Currently there are no known cases where a user got banned for using this Discord client but that doesn't mean it will never happen.\
Don't blame me if you get banned!\
I will update the above if anything changes!
## Download
Releases: https://github.com/Stone-Red-Code/DiscordCLI/releases
## Usage
1. <a href="https://github.com/Stone-Red-Code/DiscordCLI/releases">Download</a> one of the releases
1. [Download]("https://github.com/Stone-Red-Code/DiscordCLI/releases
) one of the releases
2. Execute the `DiscordCLI` file
3. Enter your <a href="https://github.com/Tyrrrz/DiscordChatExporter/wiki/Obtaining-Token-and-Channel-IDs#how-to-get-a-user-token">User Token</a>
3. Enter your [User Token](https://github.com/Tyrrrz/DiscordChatExporter/wiki/Obtaining-Token-and-Channel-IDs#how-to-get-a-user-token">)
4. Enter one of the commands below
## Commands
### help
- lists all commands
- lists all commands
### exit
- exits application
- exits application
### logout
- deletes auth token and exits application
- deletes auth token and exits application
### clear
- clears the console
### guilds
- lists all guilds you are in
- lists all guilds you are in
### dms
- lists all private channels
- lists all private channels
### channels
- lists all channels of guild
- args:<guild name/index>
- lists all channels of guild
- args: \<guild name/index>
### enterg
- enter guild
- args:<guild name/index>
- enter guild
- args: \<guild name/index>
### enterc
- enter channel
- args:<channel name/index>
- enter channel
- args: \<channel name/index>
### enterd
- enter DM channel
- args: <channel name/index>
- enter DM channel
- args: \<channel name/index>
### userinfo
- gets information about a user
- args: \<user name>
## Limitations
DiscordCLI doesn't support everything the officil Discord app does.
I'm trying to add more features continuously to it but there will be always some limitations.
### Current limitation:
DiscordCLI doesn't support everything the official Discord app does.
If you find a missing feature in DiscordCLI that is not listed below please tell me or create a pull request and update the list below.
### Current limitation
- No voice support
- Mentions can't be created easily
- You can't add/remove guilds
- You can't create/accept friend requests
- Discord online status not updating
<br>
And maybe more.
<br>
If you find a missing feature in DiscordCLI please tell me or create a pull request and update this list.
And probably more.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+266
View File
@@ -0,0 +1,266 @@
using DSharpPlus.Entities;
using DSharpPlus;
using Stone_Red_Utilities.ConsoleExtentions;
using Stone_Red_Utilities.StringExtentions;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System;
using System.Threading.Tasks;
namespace DiscordCLI
{
internal class Commands
{
private readonly DiscordClient client;
private readonly OutputManager outputManager;
public Commands(DiscordClient dicordClient, OutputManager outputMan)
{
client = dicordClient;
outputManager = outputMan;
}
protected async Task ListGuilds(string args)
{
int index = 1;
foreach (DiscordGuild guild in client.Guilds.Values)
{
Console.WriteLine($"{index}. {guild.Name}");
index++;
}
await Task.CompletedTask;
}
protected async Task ListDms(string args)
{
int index = 1;
foreach (DiscordDmChannel dmChannel in client.PrivateChannels)
{
Console.WriteLine($"{index}. {string.Join(", ", dmChannel.Recipients.Select(x => x.Username))}");
index++;
}
await Task.CompletedTask;
}
protected async Task ListGuildChannels(string args)
{
IReadOnlyCollection<DiscordChannel> discordChannels;
DiscordGuild guild;
if (args != null)
{
if (int.TryParse(args, out int ind))
{
guild = client.Guilds?.Values.ElementAtOrDefault(ind - 1);
}
else
{
guild = client.Guilds?.FirstOrDefault(x => x.Value.Name == args).Value;
}
GlobalInformation.currentTextChannel = null;
}
else
{
guild = GlobalInformation.currentGuild;
}
if (guild is null)
{
ConsoleExt.WriteLine("Guild not found!", ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
return;
}
GlobalInformation.currentGuild = guild;
discordChannels = guild.Channels;
int index = 0;
foreach (DiscordChannel channel in discordChannels.OrderBy(x => x.Position))
{
if (channel.Type == ChannelType.Category)
{
Console.WriteLine();
Console.WriteLine($"--- {channel.Name} ---");
foreach (DiscordChannel child in channel.Children.OrderBy(x => x.Position))
{
if (child.Type == ChannelType.Text)
{
index++;
Console.WriteLine($"{index}. {child.Name}");
}
else
{
ConsoleExt.WriteLine($"-. {child.Name}", ConsoleColor.DarkGray);
}
}
}
}
await Task.CompletedTask;
}
protected async Task EnterChannel(string args)
{
DiscordChannel textChannel;
if (GlobalInformation.currentGuild is null)
{
ConsoleExt.WriteLine("You are not in a guild!", ConsoleColor.Red);
return;
}
if (int.TryParse(args, out int ind))
{
textChannel = GlobalInformation.currentGuild?.Channels.Where(x => x.Type == ChannelType.Text).OrderBy(x => x.Position).ElementAtOrDefault(ind - 1);
}
else
{
textChannel = GlobalInformation.currentGuild?.Channels.Where(x => x.Type == ChannelType.Text).OrderBy(x => x.Position).FirstOrDefault(x => x.Name == args);
}
GlobalInformation.currentTextChannel = textChannel;
if (textChannel is null)
{
ConsoleExt.WriteLine("Channel not found!", ConsoleColor.Red);
return;
}
try
{
foreach (DiscordMessage message in (textChannel.GetMessagesAsync(10).Result).Reverse())
{
await outputManager.WriteMessage(message, textChannel, false);
}
Console.CursorTop--;
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex.Message, ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
}
await Task.CompletedTask;
}
protected async Task EnterDmChannel(string args)
{
DiscordDmChannel dmChannel;
GlobalInformation.currentGuild = null;
if (int.TryParse(args, out int ind))
{
dmChannel = client.PrivateChannels.ElementAtOrDefault(ind - 1);
}
else
{
dmChannel = client.PrivateChannels.FirstOrDefault(x => x.Name == args);
}
GlobalInformation.currentTextChannel = dmChannel;
if (dmChannel is null)
{
ConsoleExt.WriteLine("Channel not found!", ConsoleColor.Red);
return;
}
try
{
foreach (DiscordMessage message in (await dmChannel.GetMessagesAsync(10)).Reverse())
{
await outputManager.WriteMessage(message, dmChannel, false);
}
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex.Message, ConsoleColor.Red);
GlobalInformation.currentTextChannel = null;
}
}
protected async Task DeleteToken(string args)
{
File.Delete(Program.tokenPath);
Environment.Exit(0);
await Task.CompletedTask;
}
protected async Task UserInfo(string userName)
{
if (GlobalInformation.currentGuild is null)
{
ConsoleExt.WriteLine("You are not in a guild!", ConsoleColor.Red);
return;
}
if (userName is null)
{
ConsoleExt.WriteLine("User not found!", ConsoleColor.Red);
return;
}
DiscordUser discordUser = await GetDiscordUser(userName);
string status = discordUser?.Presence?.Status.ToString();
status ??= "N/A";
if (discordUser is DiscordMember discordMember)
{
string infoString =
$"Username: {discordMember.Username}#{discordMember.Discriminator}" + Environment.NewLine +
$"Nickname: {discordMember.Nickname ?? "N/A"}" + Environment.NewLine +
$"Roles: {string.Join(", ", discordMember.Roles.Select(x => x.Name))}" + Environment.NewLine +
$"Status: {status}" + Environment.NewLine +
$"Created at: {discordMember.CreationTimestamp}" + Environment.NewLine +
$"ID: {discordMember.Id}" + Environment.NewLine +
$"Bot: {discordMember.IsBot}";
Console.WriteLine(infoString);
}
else if (discordUser is not null)
{
string infoString =
$"Username: {discordUser.Username}#{discordUser.Discriminator}" + Environment.NewLine +
$"Status: {status}" + Environment.NewLine +
$"Created at: {discordUser.CreationTimestamp}" + Environment.NewLine +
$"ID: {discordUser.Id}" + Environment.NewLine +
$"Bot: {discordUser.IsBot}";
Console.WriteLine(infoString);
}
else
{
ConsoleExt.WriteLine("User not found!", ConsoleColor.Red);
}
async Task<DiscordUser> GetDiscordUser(string name)
{
DiscordUser discordUser = GlobalInformation.currentGuild?.Members?.FirstOrDefault(user => user.Username.EqualsIgnoreSpacesAndCase(userName));
discordUser ??= GlobalInformation.currentGuild?.Members?.FirstOrDefault(user => $"{user.Username}#{user.Discriminator}".EqualsIgnoreSpacesAndCase(userName));
discordUser ??= GlobalInformation.currentGuild?.Members?.FirstOrDefault(user => $"{user.Username}".EqualsIgnoreSpacesAndCase(userName));
discordUser ??= GlobalInformation.currentGuild?.Members?.FirstOrDefault(user => $"{user.Nickname}".EqualsIgnoreSpacesAndCase(userName));
if (discordUser is null)
{
IReadOnlyList<DiscordUser> users = await GlobalInformation.currentGuild.GetAllMembersAsync();
discordUser ??= users.FirstOrDefault(user => user.Username.EqualsIgnoreSpacesAndCase(userName));
discordUser ??= users.FirstOrDefault(user => $"{user.Username}#{user.Discriminator}".EqualsIgnoreSpacesAndCase(userName));
discordUser ??= users.FirstOrDefault(user => $"{user.Username}".EqualsIgnoreSpacesAndCase(userName));
}
return discordUser;
}
}
protected async Task Clear(string args)
{
Console.Clear();
await Task.CompletedTask;
}
}
}
@@ -1,5 +1,5 @@
using DSharpPlus;
using Stone_Red_Utilities.ColorConsole;
using Stone_Red_Utilities.ConsoleExtentions;
using System.Collections.Generic;
using System.Linq;
using System;
@@ -23,12 +23,14 @@ namespace DiscordCLI
{
{ "exit", ("exits application", null) },
{ "logout", ("deletes auth token and exits application", DeleteToken) },
{ "clear", ("clears the console", Clear) },
{ "guilds", ("lists all guilds you are in", ListGuilds) },
{ "dms", ("lists all private channels", ListDms) },
{ "channels", ("lists all channels of guild args:<guild name/index>", ListGuildChannels) },
{ "enterg", ("enter guild args:<guild name/index>", ListGuildChannels) },
{ "enterc", ("enter channel args:<channel name/index>", EnterChannel) },
{ "enterd", ("enter DM channel args:<channel name/index>", EnterDmChannel) },
{ "userinfo", ("gets information about a user args:<username>", UserInfo) },
};
Timer cooldownTimer = new Timer(1000);
@@ -47,8 +49,16 @@ namespace DiscordCLI
/// </summary>
/// <param name="input"></param>
/// <returns>exit bool and write override bool</returns>
public async Task<(bool, bool)> CheckCommand(string input)
public async Task<(bool, bool)> CheckCommand(string rawInput)
{
string input = rawInput.Trim().ToLower().Replace('\n', '\0');
if (string.IsNullOrWhiteSpace(input.StartsWith(InputManager.Prefix) ? input.Remove(0, 1) : input))
{
Console.CursorTop--;
return (false, false);
}
cooldown++;
if (cooldown > 1)
@@ -59,21 +69,26 @@ namespace DiscordCLI
return (false, true);
}
input = input.Trim().ToLower().Replace('\n', '\0');
if (string.IsNullOrWhiteSpace(input))
return (false, false);
if (input.StartsWith(InputManager.prefix))
if (input.StartsWith(InputManager.Prefix))
{
input = input.Remove(0, 1);
}
else if (GlobalInformation.currentTextChannel != null)
{
cooldown++;
Console.Write("\r" + new string(' ', Console.WindowWidth));
await GlobalInformation.currentTextChannel.SendMessageAsync(input);
return (false, false);
try
{
await GlobalInformation.currentTextChannel.SendMessageAsync(rawInput);
Console.CursorTop--;
Console.Write("\r" + new string(' ', Console.WindowWidth));
}
catch (Exception ex)
{
Console.WriteLine();
ConsoleExt.WriteLine(ex.Message, ConsoleColor.Red);
}
return (false, true);
}
Console.WriteLine();
@@ -86,7 +101,7 @@ namespace DiscordCLI
if (input == "help" || input == "?")
{
Console.WriteLine($"Prefix: '{InputManager.prefix}' (Only required in text channels)");
Console.WriteLine($"Prefix: '{InputManager.Prefix}' (Only required in text channels)");
Console.WriteLine();
for (int i = 0; i < CommandsList.Count; i++)
@@ -3,11 +3,19 @@
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<AssemblyVersion>0.0.5.0</AssemblyVersion>
<FileVersion>0.0.5.0</FileVersion>
<Version>0.0.5.0</Version>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AlwaysUpToDate" Version="1.0.0.4" />
<PackageReference Include="ColorMineStandard" Version="1.0.0" />
<PackageReference Include="DSharpPlus" Version="3.2.3" />
<PackageReference Include="Stone_Red-C-Sharp-Utilities" Version="1.0.0.2" />
<PackageReference Include="Stone_Red-C-Sharp-Utilities" Version="1.0.2.1" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\PublishProfiles\" />
</ItemGroup>
</Project>
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="Current" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<_LastSelectedProfileId>C:\Users\David\Google Drive\Programmieren\DiscordCLI\DiscordCLI\Properties\PublishProfiles\Linux-x64.pubxml</_LastSelectedProfileId>
<_LastSelectedProfileId>C:\Users\David\Programmieren\DiscordCLI\src\DiscordCLI\Properties\PublishProfiles\Linux-ARM.pubxml</_LastSelectedProfileId>
</PropertyGroup>
</Project>
@@ -3,6 +3,7 @@ using System.Threading.Tasks;
using System;
using DSharpPlus.Entities;
using System.Linq;
using System.Collections.Generic;
namespace DiscordCLI
{
@@ -10,7 +11,8 @@ namespace DiscordCLI
{
private readonly CommandsManager commandsManager;
private readonly DiscordClient client;
public const string prefix = ">";
private readonly List<string> previousInputs = new List<string>();
public const string Prefix = ">";
public string Input { get; private set; } = string.Empty;
public InputManager(DiscordClient dicordClient, CommandsManager commandsMan)
@@ -21,14 +23,15 @@ namespace DiscordCLI
public async Task ReadInput()
{
int inputListIndex = 0;
bool exit = false;
bool printOverride = false;
string lastInput = prefix;
string lastInput = Prefix;
while (!exit)
{
DiscordDmChannel dmChannel = GlobalInformation.currentTextChannel as DiscordDmChannel;
string infoString = $"\r[{client.CurrentUser.Username}#{client.CurrentUser.Discriminator}] [{(dmChannel is null ? GlobalInformation.currentGuild?.Name : "DMs")}/{(dmChannel is null ? GlobalInformation.currentTextChannel?.Name : string.Join(", ", dmChannel.Recipients.Select(x => x.Username)))}] ==> ";
if (lastInput.StartsWith(prefix) || printOverride)
if (lastInput.StartsWith(Prefix) || printOverride)
Console.Write(Environment.NewLine + infoString);
printOverride = false;
@@ -44,6 +47,26 @@ namespace DiscordCLI
{
Input = Input.Remove(Input.Length - 1);
}
else if (keyInfo.Key == ConsoleKey.UpArrow)
{
if (previousInputs.Count > 0)
Input = previousInputs[previousInputs.Count - inputListIndex - 1];
if (inputListIndex < previousInputs.Count - 1)
inputListIndex++;
Console.CursorLeft = infoString.Length - 1;
Console.Write(Input + new string(' ', Console.WindowWidth - infoString.Length - 1));
}
else if (keyInfo.Key == ConsoleKey.DownArrow)
{
if (previousInputs.Count > 0)
Input = previousInputs[previousInputs.Count - inputListIndex - 1];
if (inputListIndex > 0)
inputListIndex--;
Console.CursorLeft = infoString.Length - 1;
Console.Write(Input + new string(' ', Console.WindowWidth - infoString.Length - 1));
}
Console.Write(keyInfo.KeyChar);
if (keyInfo.Key == ConsoleKey.Backspace)
@@ -52,9 +75,20 @@ namespace DiscordCLI
Console.CursorLeft = infoString.Length + Input.Length - 1;
} while (keyInfo.Key != ConsoleKey.Enter);
if (GlobalInformation.currentTextChannel == null && !Input.StartsWith(prefix))
Input = prefix + Input;
if (GlobalInformation.currentTextChannel == null)
{
Input = Input.Trim();
if (!Input.StartsWith(Prefix))
Input = Prefix + Input;
if (previousInputs.Count > 10)
previousInputs.RemoveAt(0);
if (previousInputs.Count == 0 || previousInputs[previousInputs.Count - 1] != Input)
previousInputs.Add(new string(Input));
}
inputListIndex = 0;
lastInput = new string(Input);
Input = string.Empty;
@@ -2,12 +2,14 @@
using ColorMine.ColorSpaces;
using DSharpPlus.Entities;
using DSharpPlus;
using Stone_Red_Utilities.ColorConsole;
using Stone_Red_Utilities.ConsoleExtentions;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Threading.Tasks;
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace DiscordCLI
{
@@ -21,18 +23,18 @@ namespace DiscordCLI
client = discordClient;
}
public async Task WriteMessage(DiscordMessage message, DiscordChannel channel, DiscordGuild guild, bool writeInfo = true)
public async Task WriteMessage(DiscordMessage message, DiscordChannel channel, bool writeInfo = true)
{
try
{
if (channel.Id != GlobalInformation.currentTextChannel?.Id)
if (message.ChannelId != GlobalInformation.currentTextChannel?.Id)
return;
DiscordUser user = message.Author;
if (GlobalInformation.currentGuild is not null)
{
DiscordMember discordMember = await guild.GetMemberAsync(user.Id);
DiscordMember discordMember = await channel.Guild.GetMemberAsync(user.Id);
DiscordColor discordColor = discordMember.Color;
Color color = Color.FromArgb(discordColor.R, discordColor.G, discordColor.B);
@@ -66,11 +68,13 @@ namespace DiscordCLI
}
if (embed.Fields is not null)
{
foreach (DiscordEmbedField field in embed.Fields)
{
WriteTop(">>> ", Color.FromArgb(embed.Color.Value), message, true, false);
WriteTop($"{field.Name}{Environment.NewLine}{field.Value}", Color.White, message, false);
}
}
}
}
catch (Exception ex)
@@ -91,78 +95,102 @@ namespace DiscordCLI
private void WriteTop(string message, Color color, DiscordMessage discordMessage, bool removeText = true, bool newLine = true, string info = null)
{
ConsoleColor consoleColor = ClosestConsoleColor(color);
if (consoleColor == Console.BackgroundColor || consoleColor == ConsoleColor.DarkGray)
consoleColor = ConsoleColor.White;
if (removeText)
Console.Write('\r' + new string(' ', Console.WindowWidth) + '\r');
string[] words = message.Split(' ');
for (int i = 0; i < words.Length; i++)
foreach (Match match in Regex.Matches(message, "<@(.*?)>"))
{
ConsoleColor mentionColor = ConsoleColor.Black;
if (IsUri(words[i]))
{
mentionColor = ConsoleColor.DarkCyan;
}
foreach (DiscordUser user in discordMessage.MentionedUsers)
{
if (user?.Mention is not null)
{
if (words[i].Contains(user.Mention))
if (match.Value == user.Mention.Replace("!", string.Empty))
{
words[i] = words[i].Replace(user.Mention, $"@{user.Username}#{user.Discriminator}");
mentionColor = ConsoleColor.Blue;
message = message.Replace(match.Value, $"\0<C{(int)ConsoleColor.Blue}C>@{user.Username}#{user.Discriminator}\0");
}
}
else
{
if (words[i].Contains("<@") && words[i].Contains('>'))
mentionColor = ConsoleColor.Blue;
if (ulong.TryParse(match.Value.Replace("!", string.Empty).Replace("<@", string.Empty).Replace(">", string.Empty), out ulong id))
{
DiscordUser discordUser = client.GetUserAsync(id).Result;
message = message.Replace(match.Value, $"\0<C{(int)ConsoleColor.Blue}C>@{discordUser.Username}#{discordUser.Discriminator}\0");
}
}
}
if (!discordMessage.Channel.IsPrivate)
foreach (DiscordChannel channel in discordMessage.MentionedChannels)
{
if (channel?.Mention is not null)
if (words[i].Contains(channel.Mention))
{
words[i] = words[i].Replace(channel.Mention, $"#{channel.Name}");
mentionColor = ConsoleColor.Blue;
}
}
if (!discordMessage.Channel.IsPrivate)
foreach (DiscordRole role in discordMessage.MentionedRoles)
{
if (role?.Mention is not null)
if (words[i].Contains(role.Mention))
{
words[i] = words[i].Replace(role.Mention, $"@{role.Name}");
DiscordColor discordColor = role.Color;
mentionColor = ClosestConsoleColor(Color.FromArgb(discordColor.R, discordColor.G, discordColor.B));
}
}
ConsoleExt.Write(words[i] + " ", mentionColor == ConsoleColor.Black ? consoleColor : mentionColor);
}
ConsoleExt.Write(info, ConsoleColor.DarkGray);
foreach (Match match in Regex.Matches(message, "<#(.*?)>"))
{
foreach (DiscordChannel channel in discordMessage.MentionedChannels)
{
if (channel?.Mention is not null)
{
if (match.Value == channel.Mention)
{
message = message.Replace(match.Value, $"\0<C{(int)ConsoleColor.Blue}C>#{channel.Name}\0");
}
}
else
{
if (ulong.TryParse(match.Value.Replace("<#", string.Empty).Replace(">", string.Empty), out ulong id))
{
DiscordChannel discordChannel = client.GetChannelAsync(id).Result;
message = message.Replace(match.Value, $"\0<C{(int)ConsoleColor.Blue}C>#{discordChannel.Name}\0");
}
}
}
}
foreach (Match match in Regex.Matches(message, @"<@&(.*?)>"))
{
foreach (DiscordRole role in discordMessage.MentionedRoles)
{
if (role?.Mention is not null)
{
if (match.Value == role.Mention)
{
DiscordColor discordColor = role.Color;
message = message.Replace(match.Value, $"\0<C{(int)ClosestConsoleColor(Color.FromArgb(discordColor.R, discordColor.G, discordColor.B))}C>@{role.Name}\0");
}
}
}
}
foreach (Match match in Regex.Matches(message, @"((https?)\:\/\/|www.)[A-Za-z0-9\.\-\&\#\?\/]*", RegexOptions.IgnoreCase))
{
message = message.Replace(match.Value, $"\0<C{(int)ConsoleColor.Blue}C>{match.Value}\0");
}
foreach (string part in message.Split("\0"))
{
ConsoleColor consoleColor;
string messagePart = part;
string stringColor = Regex.Match(messagePart, "(?<=(<C))(.*)(?=C>)").Value;
bool succ = int.TryParse(stringColor, out int colorIndex);
if (succ && colorIndex >= 0 && colorIndex < 16)
{
messagePart = messagePart.Replace($"<C{stringColor}C>", string.Empty);
consoleColor = (ConsoleColor)colorIndex;
}
else
{
consoleColor = ClosestConsoleColor(color);
}
if (consoleColor == Console.BackgroundColor || consoleColor == ConsoleColor.DarkGray)
consoleColor = ConsoleColor.White;
ConsoleExt.Write(messagePart, consoleColor);
}
ConsoleExt.Write($" {info}", ConsoleColor.DarkGray);
if (newLine)
Console.WriteLine();
}
private bool IsUri(string input)
{
return Uri.TryCreate(input, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
}
private ConsoleColor ClosestConsoleColor(Color targetColor)
{
double minDif = double.MaxValue;
+15
View File
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace DiscordCLI
{
internal enum PlatformType
{
Windows,
Linux,
LinuxARM
}
}
+151
View File
@@ -0,0 +1,151 @@
using DSharpPlus;
using System.IO;
using System.Threading.Tasks;
using System;
using DSharpPlus.Exceptions;
using Stone_Red_Utilities.ConsoleExtentions;
using AlwaysUpToDate;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace DiscordCLI
{
internal class Program
{
public const string tokenPath = "token.txt";
private DiscordClient client;
private CommandsManager commandsManager;
private InputManager inputManager;
private OutputManager outputManager;
private Updater updater;
public static void Main() => new Program().Setup().GetAwaiter().GetResult();
private async Task Setup()
{
Console.ForegroundColor = ConsoleColor.White;
Console.OutputEncoding = System.Text.Encoding.UTF8;
PlatformType platformType;
if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
if (RuntimeInformation.ProcessArchitecture == Architecture.Arm || RuntimeInformation.ProcessArchitecture == Architecture.Arm64)
{
platformType = PlatformType.LinuxARM;
}
else
{
platformType = PlatformType.Linux;
}
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
platformType = PlatformType.Windows;
}
else
{
throw new PlatformNotSupportedException("DiscordCLI only supports Windows and Linux!");
}
#if DEBUG
updater = new Updater(new TimeSpan(0), $"https://raw.githubusercontent.com/Stone-Red-Code/DiscordCLI/develop/update/updateInfo{platformType}.json", "./", true);
#else
updater = new Updater(new TimeSpan(0), $"https://raw.githubusercontent.com/Stone-Red-Code/DiscordCLI/main/update/updateInfo{platformType}.json", "./", true);
#endif
updater.UpdateAvailible += Updater_UpdateAvailible;
updater.NoUpdateAvailible += Updater_NoUpdateAvailible;
updater.ProgressChanged += Updater_ProgressChanged;
updater.OnException += Updater_OnException;
updater.Start();
await Task.Delay(-1);
}
private async Task Start()
{
string token = string.Empty;
if (File.Exists(tokenPath))
token = File.ReadAllText(tokenPath);
tokenInput:
while (string.IsNullOrWhiteSpace(token))
{
Console.Write("Enter auth token: ");
token = Console.ReadLine();
}
File.WriteAllText(tokenPath, token);
try
{
client = new DiscordClient(new DiscordConfiguration()
{
Token = token,
TokenType = TokenType.User,
});
client.MessageCreated += Client_MessageCreated;
await client.ConnectAsync();
ConsoleExt.WriteLine("Welcome to DiscordCLI", ConsoleColor.Green);
}
catch (Exception ex)
{
ConsoleExt.WriteLine(ex.Message, ConsoleColor.Red);
if (ex.InnerException is UnauthorizedException)
{
File.Delete(tokenPath);
token = string.Empty;
goto tokenInput;
}
return;
}
outputManager = new OutputManager(client);
commandsManager = new CommandsManager(client, outputManager);
inputManager = new InputManager(client, commandsManager);
outputManager.InputManager = inputManager;
await inputManager.ReadInput();
Environment.Exit(0);
}
private async void Updater_NoUpdateAvailible()
{
await Start();
}
private void Updater_ProgressChanged(long? totalFileSize, long totalBytesDownloaded, double? progressPercentage)
{
Console.CursorLeft = 0;
ConsoleExt.WriteLine($"Downloading update: {progressPercentage}% {totalBytesDownloaded}/{totalFileSize}", ConsoleColor.Yellow);
}
private void Updater_UpdateAvailible(string version, string additionalInformation)
{
Console.WriteLine($"New version avalible! {version}");
updater.Update();
}
private void Updater_OnException(Exception exception)
{
ConsoleExt.WriteLine("Update failed!", ConsoleColor.Red);
ConsoleExt.WriteLine(exception.Message, ConsoleColor.Red);
Environment.Exit(-1);
}
private async Task Client_MessageCreated(DSharpPlus.EventArgs.MessageCreateEventArgs e)
{
try
{
await outputManager.WriteMessage(e.Message, e.Channel);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
}
}
}
@@ -6,7 +6,11 @@ https://go.microsoft.com/fwlink/?LinkID=208121.
<PropertyGroup>
<Configuration>Release</Configuration>
<Platform>Any CPU</Platform>
<PublishDir>bin\Release\net5.0\publish\Linux-arm</PublishDir>
<PublishDir>bin\Release\net5.0\publish\Linux-ARM</PublishDir>
<PublishProtocol>FileSystem</PublishProtocol>
<TargetFramework>net5.0</TargetFramework>
<RuntimeIdentifier>linux-arm</RuntimeIdentifier>
<SelfContained>false</SelfContained>
<PublishSingleFile>True</PublishSingleFile>
</PropertyGroup>
</Project>
@@ -3,4 +3,7 @@
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<History>True|2021-08-06T17:06:56.0342838Z;</History>
</PropertyGroup>
</Project>
@@ -3,4 +3,7 @@
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<History>True|2021-08-06T17:03:25.0377279Z;</History>
</PropertyGroup>
</Project>
@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
https://go.microsoft.com/fwlink/?LinkID=208121.
-->
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<History>True|2021-08-06T17:08:23.2338085Z;True|2021-08-06T19:06:28.4841484+02:00;True|2021-05-29T18:25:28.6698849+02:00;True|2021-05-29T17:53:55.7039453+02:00;True|2021-05-29T17:07:22.9610987+02:00;True|2021-05-29T16:21:45.0240481+02:00;</History>
</PropertyGroup>
</Project>
Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More