Compare commits
10 commits
e44338c1da
...
c7b933b3f8
Author | SHA1 | Date | |
---|---|---|---|
c7b933b3f8 | |||
baf797d8c3 | |||
8b506d01b6 | |||
2ae87f1c2d | |||
061ea355af | |||
33619938c9 | |||
fb04aa8266 | |||
e6c1b1396e | |||
eb7ce93350 | |||
b2c6a27e98 |
27 changed files with 570 additions and 208 deletions
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,4 +1,4 @@
|
|||
.vs
|
||||
.vs
|
||||
appsettings.json
|
||||
bin
|
||||
obj
|
||||
|
|
|
@ -1 +0,0 @@
|
|||
CSharpBot
|
|
@ -1,61 +0,0 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>enable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<Configurations>Release;Debug</Configurations>
|
||||
<Platforms>x64</Platforms>
|
||||
<Authors>Relms</Authors>
|
||||
<Company>Relms</Company>
|
||||
<Version>0.0.1</Version>
|
||||
<Description>Advanced C# Discord Bot made in DSharpPlus and .NET 6 Preview</Description>
|
||||
<Copyright>Copyright 2021 Relms</Copyright>
|
||||
<PackageProjectUrl>https://code.relms.dev/Relms/Sharpy</PackageProjectUrl>
|
||||
<RepositoryUrl>https://code.relms.dev/Relms/Sharpy</RepositoryUrl>
|
||||
<NeutralLanguage>en-US</NeutralLanguage>
|
||||
<PackageLicenseExpression>GPL-3.0-or-later</PackageLicenseExpression>
|
||||
<AssemblyName>CSharpBot</AssemblyName>
|
||||
<PackageId>CSharpBot</PackageId>
|
||||
<RepositoryType>git</RepositoryType>
|
||||
<AssemblyVersion>0.0.1.0</AssemblyVersion>
|
||||
<FileVersion>0.0.1.0</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<WarningLevel>5</WarningLevel>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<WarningLevel>5</WarningLevel>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DSharpPlus" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="DSharpPlus.CommandsNext" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="DSharpPlus.Interactivity" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="DSharpPlus.Lavalink" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="DSharpPlus.Rest" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="DSharpPlus.VoiceNext" Version="4.2.0-nightly-00973" />
|
||||
<PackageReference Include="IDoEverything.DSharpPlus.SlashCommands" Version="2.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-preview.7.21377.19" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-preview.7.21377.19" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-preview.7.21377.19" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-preview.7.21377.19" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="appsettings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Commands" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
|
@ -1,74 +0,0 @@
|
|||
using System;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.CommandsNext;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.Interactivity.Extensions;
|
||||
using DSharpPlus.Lavalink;
|
||||
using DSharpPlus.SlashCommands;
|
||||
using DSharpPlus.VoiceNext;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
IConfiguration config = new ConfigurationBuilder()
|
||||
.AddJsonFile("appsettings.json", false, true)
|
||||
.Build();
|
||||
|
||||
#if DEBUG
|
||||
var discord = new DiscordClient(new DiscordConfiguration
|
||||
{
|
||||
AlwaysCacheMembers = true,
|
||||
AutoReconnect = true,
|
||||
GatewayCompressionLevel = GatewayCompressionLevel.Stream,
|
||||
HttpTimeout = TimeSpan.FromSeconds(10),
|
||||
Intents = DiscordIntents.All,
|
||||
LogTimestampFormat = "MMM dd yyyy - hh:mm:ss tt",
|
||||
MinimumLogLevel = LogLevel.Debug,
|
||||
ReconnectIndefinitely = false,
|
||||
Token = config.GetValue<string>("token"),
|
||||
TokenType = TokenType.Bot
|
||||
});
|
||||
#else
|
||||
var discord = new DiscordClient(new DiscordConfiguration
|
||||
{
|
||||
AlwaysCacheMembers = true,
|
||||
AutoReconnect = true,
|
||||
GatewayCompressionLevel = GatewayCompressionLevel.Stream,
|
||||
HttpTimeout = TimeSpan.FromSeconds(10),
|
||||
Intents = DiscordIntents.All,
|
||||
LogTimestampFormat = "MMM dd yyyy - hh:mm:ss tt",
|
||||
MinimumLogLevel = LogLevel.Information,
|
||||
ReconnectIndefinitely = false,
|
||||
Token = config.GetValue<string>("token"),
|
||||
TokenType = TokenType.Bot,
|
||||
});
|
||||
#endif
|
||||
|
||||
var services = new ServiceCollection()
|
||||
.BuildServiceProvider();
|
||||
|
||||
/*var slash = discord.UseSlashCommands();
|
||||
var lavalink = discord.UseLavalink();
|
||||
var interactivity = discord.UseInteractivity();
|
||||
var voice = discord.UseVoiceNext();*/
|
||||
|
||||
// register commands
|
||||
var commands = discord.UseCommandsNext(new CommandsNextConfiguration
|
||||
{
|
||||
CaseSensitive = false,
|
||||
DmHelp = false,
|
||||
EnableDefaultHelp = true,
|
||||
EnableDms = true,
|
||||
EnableMentionPrefix = true,
|
||||
IgnoreExtraArguments = false,
|
||||
Services = services,
|
||||
StringPrefixes = new[] { "!" },
|
||||
UseDefaultCommandHandler = true
|
||||
});
|
||||
|
||||
commands.RegisterCommands(Assembly.GetExecutingAssembly());
|
||||
|
||||
await discord.ConnectAsync(new DiscordActivity("With DSharpPlus"));
|
||||
await Task.Delay(-1);
|
|
@ -1,16 +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">
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>bin\x64\Release\net6.0\publish\linux-x64\</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
|
||||
<SelfContained>false</SelfContained>
|
||||
<PublishSingleFile>True</PublishSingleFile>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -1,17 +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">
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>bin\x64\Release\net6.0\publish\linux-x64\</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RuntimeIdentifier>linux-x64</RuntimeIdentifier>
|
||||
<SelfContained>true</SelfContained>
|
||||
<PublishSingleFile>True</PublishSingleFile>
|
||||
<PublishTrimmed>True</PublishTrimmed>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -1,17 +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">
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>bin\x64\Release\net6.0\publish\win-x64\</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<SelfContained>false</SelfContained>
|
||||
<PublishSingleFile>True</PublishSingleFile>
|
||||
<PublishReadyToRun>False</PublishReadyToRun>
|
||||
</PropertyGroup>
|
||||
</Project>
|
|
@ -1,18 +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">
|
||||
<PropertyGroup>
|
||||
<Configuration>Release</Configuration>
|
||||
<Platform>x64</Platform>
|
||||
<PublishDir>bin\x64\Release\net6.0\publish\win-x64\</PublishDir>
|
||||
<PublishProtocol>FileSystem</PublishProtocol>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<RuntimeIdentifier>win-x64</RuntimeIdentifier>
|
||||
<SelfContained>true</SelfContained>
|
||||
<PublishSingleFile>True</PublishSingleFile>
|
||||
<PublishReadyToRun>False</PublishReadyToRun>
|
||||
<PublishTrimmed>True</PublishTrimmed>
|
||||
</PropertyGroup>
|
||||
</Project>
|
7
Dockerfile
Normal file
7
Dockerfile
Normal file
|
@ -0,0 +1,7 @@
|
|||
FROM debian:11.0-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY Sharpy/bin/x64/Release/net6.0/publish/linux-x64/Sharpy .
|
||||
|
||||
ENTRYPOINT [ "./Sharpy" ]
|
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CSharpBot", "CSharpBot\CSharpBot.csproj", "{57AEE340-B119-49C8-9217-D87250628498}"
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sharpy", "Sharpy\Sharpy.csproj", "{57AEE340-B119-49C8-9217-D87250628498}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
62
Sharpy/Commands/General/Info.cs
Normal file
62
Sharpy/Commands/General/Info.cs
Normal file
|
@ -0,0 +1,62 @@
|
|||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Threading.Tasks;
|
||||
using ByteSizeLib;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.SlashCommands;
|
||||
using Hardware.Info;
|
||||
|
||||
namespace Sharpy.Commands.General
|
||||
{
|
||||
public class Info : ApplicationCommandModule
|
||||
{
|
||||
[SlashCommand("info", "Get info about the bot")]
|
||||
public async Task InfoCommand(InteractionContext ctx)
|
||||
{
|
||||
var clientMember = from member in ctx.Guild.Members
|
||||
where member.Value.Id == ctx.Client.CurrentUser.Id
|
||||
select member.Value;
|
||||
|
||||
var roleColor = clientMember.First().Color;
|
||||
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = "Loading..." });
|
||||
|
||||
var hardwareInfo = new HardwareInfo();
|
||||
hardwareInfo.RefreshCPUList();
|
||||
hardwareInfo.RefreshMemoryStatus();
|
||||
|
||||
var currentRamUsage =
|
||||
Math.Round(
|
||||
Convert.ToDecimal(ByteSize
|
||||
.FromBytes(hardwareInfo.MemoryStatus.TotalPhysical - hardwareInfo.MemoryStatus.AvailablePhysical)
|
||||
.GibiBytes), 2);
|
||||
|
||||
var totalRamUsage =
|
||||
Math.Round(Convert.ToDecimal(ByteSize.FromBytes(hardwareInfo.MemoryStatus.TotalPhysical).GibiBytes), 2);
|
||||
|
||||
var embed = new DiscordEmbedBuilder()
|
||||
.WithAuthor("Sharpy")
|
||||
.WithColor(roleColor)
|
||||
.WithDescription(@$"**Library Version**: DSharpPlus Version {ctx.Client.VersionString}
|
||||
**Bot Version**: {Assembly.GetExecutingAssembly().GetName().Name} Version {Assembly.GetExecutingAssembly().GetName().Version}
|
||||
|
||||
**Bot Stats**
|
||||
**Servers**: {ctx.Client.Guilds.Count}
|
||||
**Shards**: {ctx.Client.ShardCount} (Current Shard: {ctx.Client.ShardId})
|
||||
|
||||
**System Stats**
|
||||
**OS**: {RuntimeInformation.RuntimeIdentifier}
|
||||
**CPU**: {hardwareInfo.CpuList.First().Name} (x{hardwareInfo.CpuList.Count})
|
||||
**Process RAM Usage**: {Math.Round(Convert.ToDecimal(ByteSize.FromBytes(Process.GetCurrentProcess().WorkingSet64).MebiBytes), 2)}MB
|
||||
**Total RAM Usage**: {currentRamUsage}GB/{totalRamUsage}GB ({Math.Round(currentRamUsage / totalRamUsage * 100, 2)}%)")
|
||||
.Build();
|
||||
|
||||
await ctx.EditResponseAsync(new DiscordWebhookBuilder().AddEmbed(embed));
|
||||
}
|
||||
}
|
||||
}
|
52
Sharpy/Commands/Music/Play.cs
Normal file
52
Sharpy/Commands/Music/Play.cs
Normal file
|
@ -0,0 +1,52 @@
|
|||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.Lavalink;
|
||||
using DSharpPlus.SlashCommands;
|
||||
using DSharpPlus.SlashCommands.Attributes;
|
||||
|
||||
namespace Sharpy.Commands.Music
|
||||
{
|
||||
public class Play : ApplicationCommandModule
|
||||
{
|
||||
[SlashCommand("play", "Plays a song")]
|
||||
[SlashRequireGuild]
|
||||
public async Task PlayCommand(InteractionContext ctx,
|
||||
[Option("song", "The song to play. (Accepts YouTube URLs too)")] string song)
|
||||
{
|
||||
if (ctx.Member.VoiceState == null || ctx.Member.VoiceState.Channel == null)
|
||||
{
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = "You are not in a voice channel." });
|
||||
return;
|
||||
}
|
||||
|
||||
var lava = ctx.Client.GetLavalink();
|
||||
|
||||
if (!lava.ConnectedNodes.Any())
|
||||
{
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = "The Lavalink connection is not established" });
|
||||
return;
|
||||
}
|
||||
|
||||
var node = lava.ConnectedNodes.Values.First();
|
||||
var conn = await node.ConnectAsync(ctx.Member.VoiceState.Channel);
|
||||
var loadResult = await node.Rest.GetTracksAsync(song);
|
||||
|
||||
if (loadResult.LoadResultType is LavalinkLoadResultType.LoadFailed or LavalinkLoadResultType.NoMatches)
|
||||
{
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = $"Track search failed for {song}." });
|
||||
return;
|
||||
}
|
||||
|
||||
var track = loadResult.Tracks.First();
|
||||
|
||||
await conn.PlayAsync(track);
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = $"Now playing {track.Title}!" });
|
||||
}
|
||||
}
|
||||
}
|
49
Sharpy/Commands/Music/Search.cs
Normal file
49
Sharpy/Commands/Music/Search.cs
Normal file
|
@ -0,0 +1,49 @@
|
|||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.Lavalink;
|
||||
using DSharpPlus.SlashCommands;
|
||||
using DSharpPlus.SlashCommands.Attributes;
|
||||
|
||||
namespace Sharpy.Commands.Music
|
||||
{
|
||||
public class Search : ApplicationCommandModule
|
||||
{
|
||||
[SlashCommand("search", "Searches for songs")]
|
||||
[SlashRequireGuild]
|
||||
public async Task SearchCommand(InteractionContext ctx,
|
||||
[Option("search", "The song to search for. (Accepts YouTube URLs too)")] string search)
|
||||
{
|
||||
var lava = ctx.Client.GetLavalink();
|
||||
|
||||
if (!lava.ConnectedNodes.Any())
|
||||
{
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = "The Lavalink connection is not established" });
|
||||
return;
|
||||
}
|
||||
|
||||
var node = lava.ConnectedNodes.Values.First();
|
||||
var loadResult = await node.Rest.GetTracksAsync(search);
|
||||
|
||||
if (loadResult.LoadResultType is LavalinkLoadResultType.LoadFailed or LavalinkLoadResultType.NoMatches)
|
||||
{
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder { Content = $"Track search failed for {search}." });
|
||||
return;
|
||||
}
|
||||
|
||||
var embed = new DiscordEmbedBuilder();
|
||||
embed.WithTitle($"Search Results for: `{search}`");
|
||||
|
||||
foreach (var loadResultTrack in loadResult.Tracks)
|
||||
embed.AddField($"**{loadResultTrack.Title}**", @$"**URL**: {loadResultTrack.Uri}
|
||||
**Author**: {loadResultTrack.Author}
|
||||
**Length**: {loadResultTrack.Length}", true);
|
||||
|
||||
await ctx.CreateResponseAsync(InteractionResponseType.ChannelMessageWithSource,
|
||||
new DiscordInteractionResponseBuilder().AddEmbed(embed.Build()));
|
||||
}
|
||||
}
|
||||
}
|
17
Sharpy/Database/Context.cs
Normal file
17
Sharpy/Database/Context.cs
Normal file
|
@ -0,0 +1,17 @@
|
|||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Sharpy.Database.Models;
|
||||
|
||||
namespace Sharpy.Database
|
||||
{
|
||||
public class Context : DbContext
|
||||
{
|
||||
public DbSet<Infractions> Infractions { get; set; }
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
|
||||
{
|
||||
optionsBuilder.UseNpgsql(
|
||||
$"Host={Sharpy.config.GetSection("database").GetValue<string>("host")};Port={Sharpy.config.GetSection("database").GetValue<string>("port")};Database={Sharpy.config.GetSection("database").GetValue<string>("database")};Username={Sharpy.config.GetSection("database").GetValue<string>("username")};Password={Sharpy.config.GetSection("database").GetValue<string>("password")}");
|
||||
}
|
||||
}
|
||||
}
|
28
Sharpy/Database/Models/Infractions.cs
Normal file
28
Sharpy/Database/Models/Infractions.cs
Normal file
|
@ -0,0 +1,28 @@
|
|||
using System;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace Sharpy.Database.Models
|
||||
{
|
||||
public class Infractions
|
||||
{
|
||||
[Key]
|
||||
public Guid InfractionId { get; set; }
|
||||
|
||||
[Required]
|
||||
public InfractionTypes InfractionType { get; set; }
|
||||
|
||||
[Required]
|
||||
public string InfractionReason { get; set; }
|
||||
|
||||
[Required]
|
||||
public ulong UserId { get; set; }
|
||||
}
|
||||
|
||||
public enum InfractionTypes
|
||||
{
|
||||
Ban,
|
||||
Kick,
|
||||
Mute,
|
||||
Warn
|
||||
}
|
||||
}
|
50
Sharpy/Migrations/20211016030853_InitialCreate.Designer.cs
generated
Normal file
50
Sharpy/Migrations/20211016030853_InitialCreate.Designer.cs
generated
Normal file
|
@ -0,0 +1,50 @@
|
|||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using Sharpy.Database;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Sharpy.Migrations
|
||||
{
|
||||
[DbContext(typeof(Context))]
|
||||
[Migration("20211016030853_InitialCreate")]
|
||||
partial class InitialCreate
|
||||
{
|
||||
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "6.0.0-rc.2.21480.5")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("Sharpy.Database.Models.Infractions", b =>
|
||||
{
|
||||
b.Property<Guid>("InfractionId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<string>("InfractionReason")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("InfractionType")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<decimal>("UserId")
|
||||
.HasColumnType("numeric(20,0)");
|
||||
|
||||
b.HasKey("InfractionId");
|
||||
|
||||
b.ToTable("Infractions");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
33
Sharpy/Migrations/20211016030853_InitialCreate.cs
Normal file
33
Sharpy/Migrations/20211016030853_InitialCreate.cs
Normal file
|
@ -0,0 +1,33 @@
|
|||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Sharpy.Migrations
|
||||
{
|
||||
public partial class InitialCreate : Migration
|
||||
{
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.CreateTable(
|
||||
name: "Infractions",
|
||||
columns: table => new
|
||||
{
|
||||
InfractionId = table.Column<Guid>(type: "uuid", nullable: false),
|
||||
InfractionType = table.Column<int>(type: "integer", nullable: false),
|
||||
InfractionReason = table.Column<string>(type: "text", nullable: false),
|
||||
UserId = table.Column<decimal>(type: "numeric(20,0)", nullable: false)
|
||||
},
|
||||
constraints: table =>
|
||||
{
|
||||
table.PrimaryKey("PK_Infractions", x => x.InfractionId);
|
||||
});
|
||||
}
|
||||
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropTable(
|
||||
name: "Infractions");
|
||||
}
|
||||
}
|
||||
}
|
48
Sharpy/Migrations/ContextModelSnapshot.cs
Normal file
48
Sharpy/Migrations/ContextModelSnapshot.cs
Normal file
|
@ -0,0 +1,48 @@
|
|||
// <auto-generated />
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
||||
using Sharpy.Database;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace Sharpy.Migrations
|
||||
{
|
||||
[DbContext(typeof(Context))]
|
||||
partial class ContextModelSnapshot : ModelSnapshot
|
||||
{
|
||||
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||
{
|
||||
#pragma warning disable 612, 618
|
||||
modelBuilder
|
||||
.HasAnnotation("ProductVersion", "6.0.0-rc.2.21480.5")
|
||||
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
||||
|
||||
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
||||
|
||||
modelBuilder.Entity("Sharpy.Database.Models.Infractions", b =>
|
||||
{
|
||||
b.Property<Guid>("InfractionId")
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<string>("InfractionReason")
|
||||
.IsRequired()
|
||||
.HasColumnType("text");
|
||||
|
||||
b.Property<int>("InfractionType")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<decimal>("UserId")
|
||||
.HasColumnType("numeric(20,0)");
|
||||
|
||||
b.HasKey("InfractionId");
|
||||
|
||||
b.ToTable("Infractions");
|
||||
});
|
||||
#pragma warning restore 612, 618
|
||||
}
|
||||
}
|
||||
}
|
103
Sharpy/Program.cs
Normal file
103
Sharpy/Program.cs
Normal file
|
@ -0,0 +1,103 @@
|
|||
using System;
|
||||
using System.Threading.Tasks;
|
||||
using DSharpPlus;
|
||||
using DSharpPlus.Entities;
|
||||
using DSharpPlus.Lavalink;
|
||||
using DSharpPlus.Net;
|
||||
using DSharpPlus.SlashCommands;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Sharpy.Commands.General;
|
||||
using Sharpy.Commands.Music;
|
||||
#if RELEASE
|
||||
using System.Net;
|
||||
#endif
|
||||
|
||||
namespace Sharpy
|
||||
{
|
||||
public static class Sharpy
|
||||
{
|
||||
public static readonly IConfiguration config = new ConfigurationBuilder()
|
||||
.AddJsonFile("appsettings.json", false, true)
|
||||
.Build();
|
||||
|
||||
public static async Task Main()
|
||||
{
|
||||
#if DEBUG
|
||||
var discord = new DiscordClient(new DiscordConfiguration
|
||||
{
|
||||
AlwaysCacheMembers = true,
|
||||
AutoReconnect = true,
|
||||
GatewayCompressionLevel = GatewayCompressionLevel.Stream,
|
||||
HttpTimeout = TimeSpan.FromSeconds(10),
|
||||
Intents = DiscordIntents.All,
|
||||
LogTimestampFormat = "MMM dd yyyy - hh:mm:ss tt",
|
||||
MinimumLogLevel = LogLevel.Debug,
|
||||
ReconnectIndefinitely = false,
|
||||
Token = config.GetValue<string>("token"),
|
||||
TokenType = TokenType.Bot
|
||||
});
|
||||
#else
|
||||
var discord = new DiscordClient(new DiscordConfiguration
|
||||
{
|
||||
AlwaysCacheMembers = true,
|
||||
AutoReconnect = true,
|
||||
GatewayCompressionLevel = GatewayCompressionLevel.Stream,
|
||||
HttpTimeout = TimeSpan.FromSeconds(10),
|
||||
Intents = DiscordIntents.All,
|
||||
LogTimestampFormat = "MMM dd yyyy - hh:mm:ss tt",
|
||||
MinimumLogLevel = LogLevel.Information,
|
||||
ReconnectIndefinitely = false,
|
||||
ShardCount = Convert.ToInt32(Dns.GetHostName().Substring(Dns.GetHostName().IndexOf('-') + 1)),
|
||||
ShardId = Convert.ToInt32(Dns.GetHostName().Substring(Dns.GetHostName().IndexOf('-') + 1)),
|
||||
Token = config.GetValue<string>("token"),
|
||||
TokenType = TokenType.Bot,
|
||||
});
|
||||
#endif
|
||||
|
||||
var services = new ServiceCollection()
|
||||
.BuildServiceProvider();
|
||||
|
||||
// Register Lavalink
|
||||
var lavalink = discord.UseLavalink();
|
||||
|
||||
// Register Slash Commands
|
||||
var slash = discord.UseSlashCommands(new SlashCommandsConfiguration
|
||||
{
|
||||
Services = services
|
||||
});
|
||||
|
||||
// Register Commands
|
||||
// General
|
||||
slash.RegisterCommands<Info>(772228301552222258);
|
||||
|
||||
// Music
|
||||
slash.RegisterCommands<Play>(772228301552222258);
|
||||
slash.RegisterCommands<Search>(772228301552222258);
|
||||
|
||||
await discord.ConnectAsync(new DiscordActivity("With DSharpPlus"));
|
||||
await lavalink.ConnectAsync(new LavalinkConfiguration
|
||||
{
|
||||
Password = config.GetSection("lavalink").GetValue<string>("password"),
|
||||
RestEndpoint = new ConnectionEndpoint
|
||||
{
|
||||
Hostname = config.GetSection("lavalink").GetValue<string>("host"),
|
||||
Port = config.GetSection("lavalink").GetValue<int>("port"),
|
||||
Secured = false
|
||||
},
|
||||
ResumeTimeout = 30,
|
||||
SocketAutoReconnect = true,
|
||||
SocketEndpoint = new ConnectionEndpoint
|
||||
{
|
||||
Hostname = config.GetSection("lavalink").GetValue<string>("host"),
|
||||
Port = config.GetSection("lavalink").GetValue<int>("port"),
|
||||
Secured = false
|
||||
},
|
||||
WebSocketCloseTimeout = 30
|
||||
});
|
||||
|
||||
await Task.Delay(-1);
|
||||
}
|
||||
}
|
||||
}
|
69
Sharpy/Sharpy.csproj
Normal file
69
Sharpy/Sharpy.csproj
Normal file
|
@ -0,0 +1,69 @@
|
|||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<Nullable>disable</Nullable>
|
||||
<IsPackable>false</IsPackable>
|
||||
<Configurations>Release;Debug</Configurations>
|
||||
<Platforms>x64</Platforms>
|
||||
<TrimMode>link</TrimMode>
|
||||
<TrimmerRemoveSymbols>true</TrimmerRemoveSymbols>
|
||||
<DebuggerSupport>false</DebuggerSupport>
|
||||
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
|
||||
<EventSourceSupport>false</EventSourceSupport>
|
||||
<HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>
|
||||
<InvariantGlobalization>true</InvariantGlobalization>
|
||||
<MetadataUpdaterSupport>false</MetadataUpdaterSupport>
|
||||
<UseNativeHttpHandler>true</UseNativeHttpHandler>
|
||||
<UseSystemResourceKeys>true</UseSystemResourceKeys>
|
||||
<AssemblyVersion>0.0.1.0</AssemblyVersion>
|
||||
<FileVersion>0.0.1.0</FileVersion>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x64' ">
|
||||
<CheckForOverflowUnderflow>true</CheckForOverflowUnderflow>
|
||||
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
||||
<DebugType>none</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x64' ">
|
||||
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
|
||||
<DebugType>full</DebugType>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ByteSize" Version="2.1.0" />
|
||||
<PackageReference Include="DSharpPlus" Version="4.2.0-nightly-01030" />
|
||||
<PackageReference Include="DSharpPlus.Interactivity" Version="4.2.0-nightly-01030" />
|
||||
<PackageReference Include="DSharpPlus.Lavalink" Version="4.2.0-nightly-01030" />
|
||||
<PackageReference Include="DSharpPlus.SlashCommands" Version="4.2.0-nightly-01030" />
|
||||
<PackageReference Include="Hardware.Info" Version="1.1.1.1" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.0-rc.2.21480.5" />
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.0-rc.2.21480.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.0-rc.2.21480.5">
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration" Version="6.0.0-rc.2.21480.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Binder" Version="6.0.0-rc.2.21480.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="6.0.0-rc.2.21480.5" />
|
||||
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="6.0.0-rc.2.21480.5" />
|
||||
<PackageReference Include="NATS.Client" Version="0.14.0-pre3" />
|
||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="6.0.0-rc.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="appsettings.json">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Commands\Moderation" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
48
application.yml
Normal file
48
application.yml
Normal file
|
@ -0,0 +1,48 @@
|
|||
server: # REST and WS server
|
||||
port: 2333
|
||||
address: 0.0.0.0
|
||||
lavalink:
|
||||
server:
|
||||
password: "youshallnotpass"
|
||||
sources:
|
||||
youtube: true
|
||||
bandcamp: true
|
||||
soundcloud: true
|
||||
twitch: true
|
||||
vimeo: true
|
||||
http: true
|
||||
local: false
|
||||
bufferDurationMs: 400
|
||||
youtubePlaylistLoadLimit: 6 # Number of pages at 100 each
|
||||
playerUpdateInterval: 5 # How frequently to send player updates to clients, in seconds
|
||||
youtubeSearchEnabled: true
|
||||
soundcloudSearchEnabled: true
|
||||
gc-warnings: true
|
||||
#ratelimit:
|
||||
#ipBlocks: ["1.0.0.0/8", "..."] # list of ip blocks
|
||||
#excludedIps: ["...", "..."] # ips which should be explicit excluded from usage by lavalink
|
||||
#strategy: "RotateOnBan" # RotateOnBan | LoadBalance | NanoSwitch | RotatingNanoSwitch
|
||||
#searchTriggersFail: true # Whether a search 429 should trigger marking the ip as failing
|
||||
#retryLimit: -1 # -1 = use default lavaplayer value | 0 = infinity | >0 = retry will happen this numbers times
|
||||
|
||||
metrics:
|
||||
prometheus:
|
||||
enabled: false
|
||||
endpoint: /metrics
|
||||
|
||||
sentry:
|
||||
dsn: ""
|
||||
environment: ""
|
||||
# tags:
|
||||
# some_key: some_value
|
||||
# another_key: another_value
|
||||
|
||||
logging:
|
||||
file:
|
||||
max-history: 30
|
||||
max-size: 1GB
|
||||
path: ./logs/
|
||||
|
||||
level:
|
||||
root: INFO
|
||||
lavalink: INFO
|
Reference in a new issue