fix: reformat using C# rules

This commit is contained in:
ZavaruKitsu 2022-10-08 19:26:34 +03:00
parent a731e2a8d0
commit 5ab15621a0
180 changed files with 13136 additions and 13081 deletions

View File

@ -1,378 +1,426 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.VisualBasic.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-10.0.6.0" newVersion="10.0.6.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.NonGeneric" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Specialized" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.TypeConverter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Debug" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Process" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TextWriterTraceListener" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TraceSource" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Drawing.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.DriveInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Watcher" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.IsolatedStorage" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.MemoryMappedFiles" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipes" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NameResolution" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Ping" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Requests" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Security" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.ServicePoint" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebHeaderCollection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets.Client" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ObjectModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Emit.ILGeneration" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.ResourceManager" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.Writer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.VisualC" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Formatters" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.AccessControl" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Claims" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Csp" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.X509Certificates" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal.Windows" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Thread" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.ThreadPool" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.12.0" newVersion="4.0.12.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Transactions.Local" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.VisualBasic.Core" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-10.0.6.0" newVersion="10.0.6.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Primitives" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.NonGeneric" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Collections.Specialized" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.Primitives" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ComponentModel.TypeConverter" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Data.Common" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Debug" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Process" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TextWriterTraceListener" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.TraceSource" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Drawing.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.DriveInfo" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.FileSystem.Watcher" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.IsolatedStorage" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.MemoryMappedFiles" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.IO.Pipes" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NameResolution" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Ping" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Requests" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Security" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.ServicePoint" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebHeaderCollection" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Net.WebSockets.Client" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.ObjectModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Emit.ILGeneration" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.ResourceManager" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Resources.Writer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.CompilerServices.VisualC" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation"
publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Formatters" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.AccessControl" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Claims" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Csp" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Encoding" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Cryptography.X509Certificates" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Security.Principal.Windows" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Thread" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.ThreadPool" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.12.0" newVersion="4.0.12.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Transactions.Local" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath" publicKeyToken="b03f5f7f11d50a3a" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a"
culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -1,74 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{673A56F5-6110-4AED-A68D-562FD6ED3EA6}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>AsyncFormUpdates</RootNamespace>
<AssemblyName>AsyncFormUpdates</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Xml" />
<Reference Include="Telegram.Bot, Version=17.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Telegram.Bot.17.0.0\lib\netstandard2.0\Telegram.Bot.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="forms\AsyncFormEdit.cs" />
<Compile Include="forms\AsyncFormUpdate.cs" />
<Compile Include="forms\Start.cs" />
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj">
<Project>{0bd16fb9-7ed4-4ccb-83eb-5cee538e1b6c}</Project>
<Name>TelegramBotBase</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="System.Net.Requests" Version="4.3.0" />
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
<PackageReference Include="Telegram.Bot" Version="18.0.0" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')"/>
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{673A56F5-6110-4AED-A68D-562FD6ED3EA6}</ProjectGuid>
<OutputType>Exe</OutputType>
<RootNamespace>AsyncFormUpdates</RootNamespace>
<AssemblyName>AsyncFormUpdates</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile/>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="mscorlib"/>
<Reference Include="System"/>
<Reference Include="System.Core"/>
<Reference Include="System.Xml.Linq"/>
<Reference Include="System.Data.DataSetExtensions"/>
<Reference Include="Microsoft.CSharp"/>
<Reference Include="System.Data"/>
<Reference Include="System.Net.Http"/>
<Reference Include="System.Xml"/>
<Reference Include="Telegram.Bot, Version=17.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Telegram.Bot.17.0.0\lib\netstandard2.0\Telegram.Bot.dll</HintPath>
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="forms\AsyncFormEdit.cs"/>
<Compile Include="forms\AsyncFormUpdate.cs"/>
<Compile Include="forms\Start.cs"/>
<Compile Include="Program.cs"/>
<Compile Include="Properties\AssemblyInfo.cs"/>
</ItemGroup>
<ItemGroup>
<None Include="App.config"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj">
<Project>{0bd16fb9-7ed4-4ccb-83eb-5cee538e1b6c}</Project>
<Name>TelegramBotBase</Name>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
<PackageReference Include="System.Net.Requests" Version="4.3.0"/>
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0"/>
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4"/>
<PackageReference Include="Telegram.Bot" Version="18.0.0"/>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets"/>
</Project>

View File

@ -15,8 +15,8 @@ namespace AsyncFormUpdates
var apiKey = "APIKey";
__bot = BotBaseBuilder.Create()
.QuickStart<Start>(apiKey)
.Build();
.QuickStart<Start>(apiKey)
.Build();
__bot.Start();
@ -33,17 +33,17 @@ namespace AsyncFormUpdates
private static async void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach(var s in __bot.Sessions.SessionList)
foreach (var s in __bot.Sessions.SessionList)
{
//Only for AsyncUpdateForm
if (s.Value.ActiveForm.GetType() != typeof(AsyncFormUpdate) && s.Value.ActiveForm.GetType() != typeof(AsyncFormEdit))
if (s.Value.ActiveForm.GetType() != typeof(AsyncFormUpdate) &&
s.Value.ActiveForm.GetType() != typeof(AsyncFormEdit))
{
continue;
}
await __bot.InvokeMessageLoop(s.Key);
}
}
}
}
}

View File

@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -46,8 +46,6 @@ namespace AsyncFormUpdates.forms
var m = await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
_messageId = m.MessageId;
}
}
}
}
}

View File

@ -38,7 +38,5 @@ namespace AsyncFormUpdates.forms
await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
}
}
}
}

View File

@ -6,8 +6,6 @@ namespace AsyncFormUpdates.forms
{
public class Start : AutoCleanForm
{
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
@ -30,7 +28,6 @@ namespace AsyncFormUpdates.forms
break;
}
}
public override async Task Render(MessageResult message)
@ -43,6 +40,5 @@ namespace AsyncFormUpdates.forms
await Device.Send("Choose your option", bf);
}
}
}
}

View File

@ -9,4 +9,4 @@ public class BotDbContext : DbContext
}
public DbSet<User> Users { get; set; }
}
}

View File

@ -4,4 +4,4 @@ public class User
{
public long Id { get; set; }
public string LastMessage { get; set; }
}
}

View File

@ -8,12 +8,12 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.9" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.9"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj" />
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj"/>
</ItemGroup>
</Project>

View File

@ -10,14 +10,15 @@ var serviceCollection = new ServiceCollection()
var serviceProvider = serviceCollection.BuildServiceProvider();
var bot = BotBaseBuilder.Create()
.WithAPIKey(Environment.GetEnvironmentVariable("API_KEY") ?? throw new Exception("API_KEY is not set"))
.DefaultMessageLoop()
.WithServiceProvider<StartForm>(serviceProvider)
.NoProxy()
.NoCommands()
.NoSerialization()
.DefaultLanguage()
.Build();
.WithAPIKey(Environment.GetEnvironmentVariable("API_KEY") ??
throw new Exception("API_KEY is not set"))
.DefaultMessageLoop()
.WithServiceProvider<StartForm>(serviceProvider)
.NoProxy()
.NoCommands()
.NoSerialization()
.DefaultLanguage()
.Build();
bot.Start();
await Task.Delay(-1);
await Task.Delay(-1);

View File

@ -33,4 +33,4 @@ public class StartForm : FormBase
user.LastMessage = string.IsNullOrWhiteSpace(message.MessageText) ? "<unknown>" : message.MessageText;
await _dbContext.SaveChangesAsync();
}
}
}

View File

@ -1,12 +1,12 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="TelegramBotBase" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="TelegramBotBase" Version="5.0.0"/>
</ItemGroup>
</Project>

View File

@ -2,22 +2,20 @@
using JoinHiderBot.forms;
using TelegramBotBase.Builder;
namespace JoinHiderBot
namespace JoinHiderBot;
internal class Program
{
internal class Program
private static void Main(string[] args)
{
private static void Main(string[] args)
{
var apiKey = "";
var apiKey = "";
var bot = BotBaseBuilder.Create()
.QuickStart<Start>(apiKey)
.Build();
var bot = BotBaseBuilder.Create()
.QuickStart<Start>(apiKey)
.Build();
bot.Start();
bot.Start();
Console.ReadLine();
}
Console.ReadLine();
}
}
}

View File

@ -3,21 +3,20 @@ using Telegram.Bot.Types.Enums;
using TelegramBotBase.Args;
using TelegramBotBase.Form;
namespace JoinHiderBot.forms
namespace JoinHiderBot.forms;
public class GroupManageForm : GroupForm
{
public class GroupManageForm : GroupForm
public override async Task OnMemberChanges(MemberChangeEventArgs e)
{
public override async Task OnMemberChanges(MemberChangeEventArgs e)
if (e.Type != MessageType.ChatMembersAdded && e.Type != MessageType.ChatMemberLeft)
{
if (e.Type != MessageType.ChatMembersAdded && e.Type != MessageType.ChatMemberLeft)
return;
var m = e.Result.Message;
await Device.DeleteMessage(m);
return;
}
var m = e.Result.Message;
await Device.DeleteMessage(m);
}
}
}

View File

@ -2,25 +2,23 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace JoinHiderBot.forms
namespace JoinHiderBot.forms;
public class Start : SplitterForm
{
public class Start : SplitterForm
public override async Task<bool> Open(MessageResult e)
{
public override async Task<bool> Open(MessageResult e)
{
await Device.Send("This bot works only in groups.");
return true;
}
public override async Task<bool> OpenGroup(MessageResult e)
{
var gmf = new GroupManageForm();
await NavigateTo(gmf);
return true;
}
await Device.Send("This bot works only in groups.");
return true;
}
}
public override async Task<bool> OpenGroup(MessageResult e)
{
var gmf = new GroupManageForm();
await NavigateTo(gmf);
return true;
}
}

View File

@ -3,39 +3,35 @@ using SystemCommandsBot.config;
using SystemCommandsBot.forms;
using TelegramBotBase.Builder;
namespace SystemCommandsBot
namespace SystemCommandsBot;
internal class Program
{
internal class Program
public static Config BotConfig { get; set; }
private static void Main(string[] args)
{
public static Config BotConfig { get; set; }
BotConfig = Config.Load();
private static void Main(string[] args)
if (BotConfig.ApiKey == null || BotConfig.ApiKey.Trim() == "")
{
BotConfig = Config.Load();
if (BotConfig.ApiKey == null || BotConfig.ApiKey.Trim() == "")
{
Console.WriteLine("Config created...");
Console.ReadLine();
return;
}
var bot = BotBaseBuilder.Create()
.QuickStart<StartForm>(BotConfig.ApiKey)
.Build();
bot.Start();
Console.WriteLine("Bot started");
Console.WriteLine("Config created...");
Console.ReadLine();
bot.Stop();
return;
}
var bot = BotBaseBuilder.Create()
.QuickStart<StartForm>(BotConfig.ApiKey)
.Build();
bot.Start();
Console.WriteLine("Bot started");
Console.ReadLine();
bot.Stop();
}
}
}

View File

@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
<PackageReference Include="TelegramBotBase" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.1"/>
<PackageReference Include="TelegramBotBase" Version="5.0.0"/>
</ItemGroup>
</Project>

View File

@ -1,25 +1,21 @@
namespace SystemCommandsBot.commands
namespace SystemCommandsBot.commands;
public class Commando
{
public class Commando
{
public int Id { get; set; }
public int Id { get; set; }
public string Title { get; set; }
public string Title { get; set; }
public string ShellCmd { get; set; }
public string ShellCmd { get; set; }
public bool Enabled { get; set; } = true;
public bool Enabled { get; set; } = true;
public string Action { get; set; }
public string Action { get; set; }
public bool UseShell { get; set; } = true;
public bool UseShell { get; set; } = true;
public int? MaxInstances { get; set; }
public int? MaxInstances { get; set; }
public string ProcName
{
get;set;
}
}
}
public string ProcName { get; set; }
}

View File

@ -4,90 +4,90 @@ using System.IO;
using Newtonsoft.Json;
using SystemCommandsBot.commands;
namespace SystemCommandsBot.config
namespace SystemCommandsBot.config;
public class Config
{
public class Config
public Config()
{
public string Password { get; set; }
Commandos = new List<Commando>();
}
public string ApiKey { get; set; }
public string Password { get; set; }
public List<Commando> Commandos { get; set; }
public string ApiKey { get; set; }
public List<Commando> Commandos { get; set; }
public Config()
public void LoadDefaultValues()
{
ApiKey = "";
Commandos.Add(new Commando
{
Commandos = new List<Commando>();
Id = 0, Enabled = true, Title = "Test Befehl", ShellCmd = "explorer.exe", Action = "start", MaxInstances = 2
});
}
public static Config Load()
{
try
{
return Load(AppContext.BaseDirectory + "config\\default.cfg");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
public void LoadDefaultValues()
return null;
}
public static Config Load(string path)
{
try
{
ApiKey = "";
Commandos.Add(new Commando { Id = 0, Enabled = true, Title = "Test Befehl", ShellCmd = "explorer.exe", Action = "start", MaxInstances = 2 });
var cfg = JsonConvert.DeserializeObject<Config>(File.ReadAllText(path));
return cfg;
}
catch (DirectoryNotFoundException)
{
var di = new DirectoryInfo(path);
if (!Directory.Exists(di.Parent.FullName))
{
Directory.CreateDirectory(di.Parent.FullName);
}
var cfg = new Config();
cfg.LoadDefaultValues();
cfg.Save(path);
return cfg;
}
catch (FileNotFoundException)
{
var cfg = new Config();
cfg.LoadDefaultValues();
cfg.Save(path);
return cfg;
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
return null;
}
public static Config Load()
public void Save(string path)
{
try
{
try
{
return Load(AppContext.BaseDirectory + "config\\default.cfg");
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
return null;
File.WriteAllText(path, JsonConvert.SerializeObject(this));
}
public static Config Load(string path)
catch
{
try
{
var cfg = JsonConvert.DeserializeObject<Config>(File.ReadAllText(path));
return cfg;
}
catch (DirectoryNotFoundException)
{
var di = new DirectoryInfo(path);
if (!Directory.Exists(di.Parent.FullName))
{
Directory.CreateDirectory(di.Parent.FullName);
}
var cfg = new Config();
cfg.LoadDefaultValues();
cfg.Save(path);
return cfg;
}
catch (FileNotFoundException)
{
var cfg = new Config();
cfg.LoadDefaultValues();
cfg.Save(path);
return cfg;
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
return null;
}
public void Save(string path)
{
try
{
File.WriteAllText(path, JsonConvert.SerializeObject(this));
}
catch
{
}
}
}
}
}

View File

@ -6,167 +6,151 @@ using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace SystemCommandsBot.forms
namespace SystemCommandsBot.forms;
public class CmdForm : AutoCleanForm
{
public class CmdForm : AutoCleanForm
public DateTime ExpiresAt { get; set; }
public int? MessageId { get; set; }
public override Task Load(MessageResult message)
{
public DateTime ExpiresAt { get; set; }
public int? MessageId { get; set; }
public override Task Load(MessageResult message)
{
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
var btn = message.RawData;
var id = -1;
if (!int.TryParse(btn, out id))
{
return;
}
var cmd = Program.BotConfig.Commandos.Where(a => a.Enabled && a.Id == id).FirstOrDefault();
if (cmd == null)
{
await Device.Send("Cmd nicht verfügbar.");
return;
}
message.Handled = true;
switch (cmd.Action)
{
case "start":
var fi = new FileInfo(cmd.ShellCmd);
if (cmd.MaxInstances != null && cmd.MaxInstances >= 0)
{
if (Process.GetProcessesByName(cmd.ProcName).Count() >= cmd.MaxInstances)
{
await Device.Send("Anwendung läuft bereits.");
await message.ConfirmAction("Anwendung läuft bereits.");
return;
}
}
var psi = new ProcessStartInfo
{
FileName = cmd.ShellCmd,
WorkingDirectory = fi.DirectoryName,
UseShellExecute = cmd.UseShell
};
Process.Start(psi);
await Device.Send(fi.Name + " wurde gestarted.");
await message.ConfirmAction(fi.Name + " wurde gestarted.");
break;
case "kill":
var fi2 = new FileInfo(cmd.ShellCmd);
var pros = fi2.Name.Replace(fi2.Extension, "");
var proc = Process.GetProcessesByName(pros).ToList();
foreach (var p in proc)
{
try
{
p.Kill();
}
catch
{
}
}
await Device.Send(fi2.Name + " wurde beendet.");
await message.ConfirmAction(fi2.Name + " wurde beendet.");
break;
case "restart":
var fi3 = new FileInfo(cmd.ShellCmd);
var pros2 = fi3.Name.Replace(fi3.Extension, "");
var proc2 = Process.GetProcessesByName(pros2).ToList();
foreach (var p in proc2)
{
try
{
p.Kill();
}
catch
{
}
}
var fi4 = new FileInfo(cmd.ShellCmd);
var psi2 = new ProcessStartInfo
{
FileName = cmd.ShellCmd,
WorkingDirectory = fi4.DirectoryName
};
psi2.FileName = cmd.ShellCmd;
psi2.UseShellExecute = cmd.UseShell;
Process.Start(psi2);
await Device.Send(fi3.Name + " wurde neugestarted.");
await message.ConfirmAction(fi3.Name + " wurde neugestarted.");
break;
default:
await message.ConfirmAction();
break;
}
}
public override async Task Render(MessageResult message)
{
if (MessageId == null)
{
var buttons = Program.BotConfig.Commandos.Where(a => a.Enabled).Select(a => new ButtonBase(a.Title, a.Id.ToString()));
var bf = new ButtonForm();
bf.AddSplitted(buttons, 1);
await Device.Send("Deine Optionen", bf);
}
}
return Task.CompletedTask;
}
}
public override async Task Action(MessageResult message)
{
var btn = message.RawData;
var id = -1;
if (!int.TryParse(btn, out id))
{
return;
}
var cmd = Program.BotConfig.Commandos.Where(a => a.Enabled && a.Id == id).FirstOrDefault();
if (cmd == null)
{
await Device.Send("Cmd nicht verfügbar.");
return;
}
message.Handled = true;
switch (cmd.Action)
{
case "start":
var fi = new FileInfo(cmd.ShellCmd);
if (cmd.MaxInstances != null && cmd.MaxInstances >= 0)
{
if (Process.GetProcessesByName(cmd.ProcName).Count() >= cmd.MaxInstances)
{
await Device.Send("Anwendung läuft bereits.");
await message.ConfirmAction("Anwendung läuft bereits.");
return;
}
}
var psi = new ProcessStartInfo
{
FileName = cmd.ShellCmd,
WorkingDirectory = fi.DirectoryName,
UseShellExecute = cmd.UseShell
};
Process.Start(psi);
await Device.Send(fi.Name + " wurde gestarted.");
await message.ConfirmAction(fi.Name + " wurde gestarted.");
break;
case "kill":
var fi2 = new FileInfo(cmd.ShellCmd);
var pros = fi2.Name.Replace(fi2.Extension, "");
var proc = Process.GetProcessesByName(pros).ToList();
foreach (var p in proc)
{
try
{
p.Kill();
}
catch
{
}
}
await Device.Send(fi2.Name + " wurde beendet.");
await message.ConfirmAction(fi2.Name + " wurde beendet.");
break;
case "restart":
var fi3 = new FileInfo(cmd.ShellCmd);
var pros2 = fi3.Name.Replace(fi3.Extension, "");
var proc2 = Process.GetProcessesByName(pros2).ToList();
foreach (var p in proc2)
{
try
{
p.Kill();
}
catch
{
}
}
var fi4 = new FileInfo(cmd.ShellCmd);
var psi2 = new ProcessStartInfo
{
FileName = cmd.ShellCmd,
WorkingDirectory = fi4.DirectoryName
};
psi2.FileName = cmd.ShellCmd;
psi2.UseShellExecute = cmd.UseShell;
Process.Start(psi2);
await Device.Send(fi3.Name + " wurde neugestarted.");
await message.ConfirmAction(fi3.Name + " wurde neugestarted.");
break;
default:
await message.ConfirmAction();
break;
}
}
public override async Task Render(MessageResult message)
{
if (MessageId == null)
{
var buttons = Program.BotConfig.Commandos.Where(a => a.Enabled)
.Select(a => new ButtonBase(a.Title, a.Id.ToString()));
var bf = new ButtonForm();
bf.AddSplitted(buttons, 1);
await Device.Send("Deine Optionen", bf);
}
}
}

View File

@ -3,39 +3,36 @@ using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace SystemCommandsBot.forms
namespace SystemCommandsBot.forms;
public class StartForm : FormBase
{
public class StartForm : FormBase
public string Password { get; set; }
public override Task Load(MessageResult message)
{
public string Password { get; set; }
public override Task Load(MessageResult message)
var inp = message.MessageText;
if (Program.BotConfig.Password == inp)
{
var inp = message.MessageText;
if (Program.BotConfig.Password == inp)
{
Password = inp;
}
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
{
if (Password == null || Password.Trim() == "")
{
await Device.Send("Bitte gib dein Passwort an.");
return;
}
var cmd = new CmdForm();
cmd.ExpiresAt = DateTime.Now.AddDays(14);
await NavigateTo(cmd);
Password = inp;
}
return Task.CompletedTask;
}
}
public override async Task Render(MessageResult message)
{
if (Password == null || Password.Trim() == "")
{
await Device.Send("Bitte gib dein Passwort an.");
return;
}
var cmd = new CmdForm();
cmd.ExpiresAt = DateTime.Now.AddDays(14);
await NavigateTo(cmd);
}
}

View File

@ -20,7 +20,7 @@ namespace TelegramBotBase.Extensions.Images
}
/// <summary>
/// Sends an image
/// Sends an image
/// </summary>
/// <param name="image"></param>
/// <param name="name"></param>
@ -28,18 +28,20 @@ namespace TelegramBotBase.Extensions.Images
/// <param name="replyTo"></param>
/// <param name="disableNotification"></param>
/// <returns></returns>
public static async Task<Message> SendPhoto(this DeviceSession session, Image image, string name, string caption, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
public static async Task<Message> SendPhoto(this DeviceSession session, Image image, string name,
string caption, ButtonForm buttons = null, int replyTo = 0,
bool disableNotification = false)
{
using (var fileStream = ToStream(image, ImageFormat.Png))
{
var fts = new InputOnlineFile(fileStream, name);
return await session.SendPhoto(fts, caption: caption, buttons, replyTo, disableNotification);
return await session.SendPhoto(fts, caption, buttons, replyTo, disableNotification);
}
}
/// <summary>
/// Sends an image
/// Sends an image
/// </summary>
/// <param name="image"></param>
/// <param name="name"></param>
@ -47,14 +49,16 @@ namespace TelegramBotBase.Extensions.Images
/// <param name="replyTo"></param>
/// <param name="disableNotification"></param>
/// <returns></returns>
public static async Task<Message> SendPhoto(this DeviceSession session, Bitmap image, string name, string caption, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
public static async Task<Message> SendPhoto(this DeviceSession session, Bitmap image, string name,
string caption, ButtonForm buttons = null, int replyTo = 0,
bool disableNotification = false)
{
using (var fileStream = ToStream(image, ImageFormat.Png))
{
var fts = new InputOnlineFile(fileStream, name);
return await session.SendPhoto(fts, caption: caption, buttons, replyTo, disableNotification);
return await session.SendPhoto(fts, caption, buttons, replyTo, disableNotification);
}
}
}
}
}

View File

@ -3,6 +3,5 @@
[![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/v/TelegramBotBase.Extensions.Images.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images/)
[![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase)
[![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
[![Package Downloads](https://img.shields.io/nuget/dt/TelegramBotBase.Extensions.Images.svg?style=flat-square&label=Package%20Downloads)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images)

View File

@ -1,24 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net5;netcoreapp3.1;net6</TargetFrameworks>
<RepositoryUrl>https://github.com/MajMcCloud/TelegramBotFramework</RepositoryUrl>
<PackageProjectUrl>https://github.com/MajMcCloud/TelegramBotFramework</PackageProjectUrl>
<Copyright>MIT</Copyright>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net5;netcoreapp3.1;net6</TargetFrameworks>
<RepositoryUrl>https://github.com/MajMcCloud/TelegramBotFramework</RepositoryUrl>
<PackageProjectUrl>https://github.com/MajMcCloud/TelegramBotFramework</PackageProjectUrl>
<Copyright>MIT</Copyright>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Drawing.Common" Version="6.0.0" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="System.Drawing.Common" Version="6.0.0"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj"/>
</ItemGroup>
</Project>

View File

@ -6,16 +6,17 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
{
public static class BotBaseBuilderExtensions
{
/// <summary>
/// Uses an Microsoft SQL Server Database to save and restore sessions.
/// Uses an Microsoft SQL Server Database to save and restore sessions.
/// </summary>
/// <param name="builder"></param>
/// <param name="connectionString"></param>
/// <param name="tablePrefix"></param>
/// <param name="fallbackForm"></param>
/// <returns></returns>
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder, string connectionString, Type fallbackForm = null, string tablePrefix = "tgb_")
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder,
string connectionString, Type fallbackForm = null,
string tablePrefix = "tgb_")
{
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
@ -26,7 +27,7 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
/// <summary>
/// Uses an Microsoft SQL Server Database to save and restore sessions.
/// Uses an Microsoft SQL Server Database to save and restore sessions.
/// </summary>
/// <param name="builder"></param>
/// <param name="hostOrIP"></param>
@ -36,9 +37,12 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
/// <param name="tablePrefix"></param>
/// <param name="fallbackForm"></param>
/// <returns></returns>
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder, string hostOrIP, string databaseName, string userId, string password, Type fallbackForm = null, string tablePrefix = "tgb_")
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder, string hostOrIP,
string databaseName, string userId, string password,
Type fallbackForm = null, string tablePrefix = "tgb_")
{
var connectionString = $"Server={hostOrIP}; Database={databaseName}; User Id={userId}; Password={password}; TrustServerCertificate=true;";
var connectionString =
$"Server={hostOrIP}; Database={databaseName}; User Id={userId}; Password={password}; TrustServerCertificate=true;";
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
@ -48,7 +52,7 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
}
/// <summary>
/// Uses an Microsoft SQL Server Database with Windows Authentication to save and restore sessions.
/// Uses an Microsoft SQL Server Database with Windows Authentication to save and restore sessions.
/// </summary>
/// <param name="builder"></param>
/// <param name="hostOrIP"></param>
@ -56,12 +60,17 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
/// <param name="tablePrefix"></param>
/// <param name="fallbackForm"></param>
/// <returns></returns>
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder, string hostOrIP, string databaseName, bool integratedSecurity = true, Type fallbackForm = null, string tablePrefix = "tgb_")
public static ILanguageSelectionStage UseSqlDatabase(this ISessionSerializationStage builder, string hostOrIP,
string databaseName, bool integratedSecurity = true,
Type fallbackForm = null, string tablePrefix = "tgb_")
{
if (!integratedSecurity)
{
throw new ArgumentOutOfRangeException();
}
var connectionString = $"Server={hostOrIP}; Database={databaseName}; Integrated Security=true; TrustServerCertificate=true;";
var connectionString =
$"Server={hostOrIP}; Database={databaseName}; Integrated Security=true; TrustServerCertificate=true;";
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
@ -70,4 +79,4 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
return builder as BotBaseBuilder;
}
}
}
}

View File

@ -11,19 +11,19 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
{
public class MssqlSerializer : IStateMachine
{
public Type FallbackStateForm { get; set; }
public string ConnectionString { get; }
public string TablePrefix { get; set; }
/// <summary>
/// Will initialize the state machine.
/// Will initialize the state machine.
/// </summary>
/// <param name="file">Path of the file and name where to save the session details.</param>
/// <param name="fallbackStateForm">Type of Form which will be saved instead of Form which has <seealso cref="Attributes.IgnoreState"/> attribute declared. Needs to be subclass of <seealso cref="Form.FormBase"/>.</param>
/// <param name="fallbackStateForm">
/// Type of Form which will be saved instead of Form which has
/// <seealso cref="Attributes.IgnoreState" /> attribute declared. Needs to be subclass of
/// <seealso cref="Form.FormBase" />.
/// </param>
/// <param name="overwrite">Declares of the file could be overwritten.</param>
public MssqlSerializer(string connectionString, string tablePrefix = "tgb_", Type fallbackStateForm = null)
{
this.ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
TablePrefix = tablePrefix;
@ -35,6 +35,10 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
}
}
public string ConnectionString { get; }
public string TablePrefix { get; set; }
public Type FallbackStateForm { get; set; }
public StateContainer LoadFormStates()
{
var sc = new StateContainer();
@ -44,7 +48,8 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "SELECT deviceId, deviceTitle, FormUri, QualifiedName FROM " + TablePrefix + "devices_sessions";
command.CommandText = "SELECT deviceId, deviceTitle, FormUri, QualifiedName FROM " + TablePrefix +
"devices_sessions";
var dataTable = new DataTable();
using (var dataAdapter = new SqlDataAdapter(command))
@ -73,7 +78,8 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
}
var command2 = connection.CreateCommand();
command2.CommandText = "SELECT [key], value, type FROM " + TablePrefix + "devices_sessions_data WHERE deviceId = @deviceId";
command2.CommandText = "SELECT [key], value, type FROM " + TablePrefix +
"devices_sessions_data WHERE deviceId = @deviceId";
command2.Parameters.Add(new SqlParameter("@deviceId", r["deviceId"]));
var dataTable2 = new DataTable();
@ -91,13 +97,10 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
se.Values.Add(key, value);
}
}
}
}
connection.Close();
}
@ -127,13 +130,15 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
var sessionCommand = connection.CreateCommand();
var dataCommand = connection.CreateCommand();
sessionCommand.CommandText = "INSERT INTO " + TablePrefix + "devices_sessions (deviceId, deviceTitle, FormUri, QualifiedName) VALUES (@deviceId, @deviceTitle, @FormUri, @QualifiedName)";
sessionCommand.CommandText = "INSERT INTO " + TablePrefix +
"devices_sessions (deviceId, deviceTitle, FormUri, QualifiedName) VALUES (@deviceId, @deviceTitle, @FormUri, @QualifiedName)";
sessionCommand.Parameters.Add(new SqlParameter("@deviceId", ""));
sessionCommand.Parameters.Add(new SqlParameter("@deviceTitle", ""));
sessionCommand.Parameters.Add(new SqlParameter("@FormUri", ""));
sessionCommand.Parameters.Add(new SqlParameter("@QualifiedName", ""));
dataCommand.CommandText = "INSERT INTO " + TablePrefix + "devices_sessions_data (deviceId, [key], value, type) VALUES (@deviceId, @key, @value, @type)";
dataCommand.CommandText = "INSERT INTO " + TablePrefix +
"devices_sessions_data (deviceId, [key], value, type) VALUES (@deviceId, @key, @value, @type)";
dataCommand.Parameters.Add(new SqlParameter("@deviceId", ""));
dataCommand.Parameters.Add(new SqlParameter("@key", ""));
dataCommand.Parameters.Add(new SqlParameter("@value", ""));
@ -169,13 +174,10 @@ namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
dataCommand.ExecuteNonQuery();
}
}
connection.Close();
}
}
}
}
}

View File

@ -3,7 +3,6 @@
[![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/v/TelegramBotBase.Extensions.Serializer.Database.MSSQL.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL/)
[![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase)
[![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
[![Package Downloads](https://img.shields.io/nuget/dt/TelegramBotBase.Extensions.Serializer.Database.MSSQL.svg?style=flat-square&label=Package%20Downloads)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL)

View File

@ -1,30 +1,30 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net5;netcoreapp3.1;net6</TargetFrameworks>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<RepositoryUrl>https://github.com/MajMcCloud/TelegramBotFramework</RepositoryUrl>
<PackageProjectUrl>https://github.com/MajMcCloud/TelegramBotFramework</PackageProjectUrl>
<Copyright>MIT</Copyright>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<AssemblyVersion>1.0.1</AssemblyVersion>
<FileVersion>1.0.1</FileVersion>
<Version>1.0.1</Version>
<Description>A session serializer for Microsoft SQL Server.
</Description>
</PropertyGroup>
<PropertyGroup>
<TargetFrameworks>netstandard2.0;net5;netcoreapp3.1;net6</TargetFrameworks>
<GeneratePackageOnBuild>True</GeneratePackageOnBuild>
<RepositoryUrl>https://github.com/MajMcCloud/TelegramBotFramework</RepositoryUrl>
<PackageProjectUrl>https://github.com/MajMcCloud/TelegramBotFramework</PackageProjectUrl>
<Copyright>MIT</Copyright>
<IncludeSymbols>true</IncludeSymbols>
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
<AssemblyVersion>1.0.1</AssemblyVersion>
<FileVersion>1.0.1</FileVersion>
<Version>1.0.1</Version>
<Description>A session serializer for Microsoft SQL Server.
</Description>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.0" />
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Data.SqlClient" Version="5.0.0"/>
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.1.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj"/>
</ItemGroup>
</Project>

View File

@ -1,37 +1,81 @@
USE [telegram_bot]
USE
[telegram_bot]
GO
/****** Object: Table [dbo].[tgb_devices_sessions] Script Date: 30.06.2022 16:22:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tgb_devices_sessions](
[deviceId] [bigint] NOT NULL,
[deviceTitle] [nvarchar](512) NOT NULL,
[FormUri] [nvarchar](512) NOT NULL,
[QualifiedName] [nvarchar](512) NOT NULL,
CONSTRAINT [PK_tgb_devices_sessions_1] PRIMARY KEY CLUSTERED
CREATE TABLE [dbo].[tgb_devices_sessions]
(
[deviceId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
[
deviceId] [
bigint]
NOT
NULL, [
deviceTitle] [
nvarchar]
(
512
) NOT NULL,
[FormUri] [nvarchar]
(
512
) NOT NULL,
[QualifiedName] [nvarchar]
(
512
) NOT NULL,
CONSTRAINT [PK_tgb_devices_sessions_1] PRIMARY KEY CLUSTERED
(
[
deviceId] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
ON [PRIMARY]
)
ON [PRIMARY]
GO
/****** Object: Table [dbo].[tgb_devices_sessions_data] Script Date: 30.06.2022 16:22:09 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tgb_devices_sessions_data](
[Id] [uniqueidentifier] NOT NULL,
[deviceId] [bigint] NOT NULL,
[key] [nvarchar](512) NOT NULL,
[value] [nvarchar](max) NOT NULL,
[type] [nvarchar](512) NOT NULL,
CONSTRAINT [PK_tgb_devices_session_data] PRIMARY KEY CLUSTERED
SET ANSI_NULLS
ON
GO
SET QUOTED_IDENTIFIER
ON
GO
CREATE TABLE [dbo].[tgb_devices_sessions_data]
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[tgb_devices_sessions_data] ADD CONSTRAINT [DF_tgb_devices_session_data_Id] DEFAULT (newid()) FOR [Id]
GO
[
Id] [
uniqueidentifier]
NOT
NULL, [
deviceId] [
bigint]
NOT
NULL, [
key] [
nvarchar]
(
512
) NOT NULL,
[value] [nvarchar]
(
max
) NOT NULL,
[type] [nvarchar]
(
512
) NOT NULL,
CONSTRAINT [PK_tgb_devices_session_data] PRIMARY KEY CLUSTERED
(
[
Id] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
ON [PRIMARY]
)
ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE [dbo].[tgb_devices_sessions_data] ADD CONSTRAINT [DF_tgb_devices_session_data_Id] DEFAULT (newid()) FOR [Id]
GO

View File

@ -1,14 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<startup>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
</startup>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>

View File

@ -7,109 +7,106 @@ using TelegramBotBase.Commands;
using TelegramBotBase.Enums;
using TelegramBotBaseTest.Tests;
namespace TelegramBotBaseTest
namespace TelegramBotBaseTest;
internal class Program
{
internal class Program
private static void Main(string[] args)
{
private static void Main(string[] args)
var apiKey = "";
var bb = BotBaseBuilder
.Create()
.WithAPIKey(apiKey)
.DefaultMessageLoop()
.WithStartForm<Start>()
.NoProxy()
.CustomCommands(a =>
{
a.Start("Starts the bot");
a.Add("myid", "Returns my Device ID");
a.Help("Should show you some help");
a.Settings("Should show you some settings");
a.Add("form1", "Opens test form 1");
a.Add("form2", "Opens test form 2");
a.Add("params", "Returns all send parameters as a message.");
})
.NoSerialization()
.UseEnglish()
.Build();
bb.BotCommand += Bb_BotCommand;
//Update Bot commands to botfather
bb.UploadBotCommands().Wait();
bb.SetSetting(ESettings.LogAllMessages, true);
bb.Message += (s, en) =>
{
Console.WriteLine(en.DeviceId + " " + en.Message.MessageText + " " + (en.Message.RawData ?? ""));
};
var apiKey = "";
bb.Start();
var bb = BotBaseBuilder
.Create()
.WithAPIKey(apiKey)
.DefaultMessageLoop()
.WithStartForm<Start>()
.NoProxy()
.CustomCommands(a =>
{
a.Start("Starts the bot");
a.Add("myid", "Returns my Device ID");
a.Help("Should show you some help");
a.Settings("Should show you some settings");
a.Add("form1", "Opens test form 1");
a.Add("form2", "Opens test form 2");
a.Add("params", "Returns all send parameters as a message.");
})
.NoSerialization()
.UseEnglish()
.Build();
Console.WriteLine("Telegram Bot started...");
Console.WriteLine("Press q to quit application.");
bb.BotCommand += Bb_BotCommand;
Console.ReadLine();
//Update Bot commands to botfather
bb.UploadBotCommands().Wait();
bb.Stop();
}
bb.SetSetting(ESettings.LogAllMessages, true);
bb.Message += (s, en) =>
{
Console.WriteLine(en.DeviceId + " " + en.Message.MessageText + " " + (en.Message.RawData ?? ""));
};
bb.Start();
Console.WriteLine("Telegram Bot started...");
Console.WriteLine("Press q to quit application.");
Console.ReadLine();
bb.Stop();
}
private static async Task Bb_BotCommand(object sender, BotCommandEventArgs en)
private static async Task Bb_BotCommand(object sender, BotCommandEventArgs en)
{
switch (en.Command)
{
switch (en.Command)
{
case "/start":
case "/start":
var start = new Menu();
var start = new Menu();
await en.Device.ActiveForm.NavigateTo(start);
await en.Device.ActiveForm.NavigateTo(start);
break;
case "/form1":
break;
case "/form1":
var form1 = new TestForm();
var form1 = new TestForm();
await en.Device.ActiveForm.NavigateTo(form1);
await en.Device.ActiveForm.NavigateTo(form1);
break;
break;
case "/form2":
case "/form2":
var form2 = new TestForm2();
var form2 = new TestForm2();
await en.Device.ActiveForm.NavigateTo(form2);
await en.Device.ActiveForm.NavigateTo(form2);
break;
break;
case "/myid":
case "/myid":
await en.Device.Send($"Your Device ID is: {en.DeviceId}");
await en.Device.Send($"Your Device ID is: {en.DeviceId}");
en.Handled = true;
en.Handled = true;
break;
break;
case "/params":
case "/params":
var m = en.Parameters.DefaultIfEmpty("").Aggregate((a, b) => a + " and " + b);
var m = en.Parameters.DefaultIfEmpty("").Aggregate((a, b) => a + " and " + b);
await en.Device.Send("Your parameters are: " + m, replyTo: en.Device.LastMessageId);
await en.Device.Send("Your parameters are: " + m, replyTo: en.Device.LastMessageId);
en.Handled = true;
en.Handled = true;
break;
}
break;
}
}
}

View File

@ -32,4 +32,4 @@ using System.Runtime.InteropServices;
// übernehmen, indem Sie "*" eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@ -1,34 +1,35 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net5;net6</TargetFrameworks>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Configurations>Debug;Release</Configurations>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFrameworks>netcoreapp3.1;net5;net6</TargetFrameworks>
<LangVersion>10</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<Configurations>Debug;Release</Configurations>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase.Extensions.Images\TelegramBotBase.Extensions.Images.csproj" />
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase.Extensions.Images\TelegramBotBase.Extensions.Images.csproj" />
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
</Project>

View File

@ -3,97 +3,92 @@ using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class ButtonTestForm : AutoCleanForm
{
public class ButtonTestForm : AutoCleanForm
public ButtonTestForm()
{
Opened += ButtonTestForm_Opened;
}
public ButtonTestForm()
private async Task ButtonTestForm_Opened(object sender, EventArgs e)
{
await Device.Send("Hello world! (Click 'back' to get back to Start)");
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
{
Opened += ButtonTestForm_Opened;
return;
}
private async Task ButtonTestForm_Opened(object sender, EventArgs e)
message.Handled = true;
switch (call.Value)
{
await Device.Send("Hello world! (Click 'back' to get back to Start)");
}
case "button1":
public override async Task Action(MessageResult message)
{
await Device.Send("Button 1 pressed");
var call = message.GetData<CallbackData>();
break;
await message.ConfirmAction();
case "button2":
await Device.Send("Button 2 pressed");
if (call == null)
return;
break;
message.Handled = true;
case "button3":
switch (call.Value)
{
case "button1":
await Device.Send("Button 3 pressed");
await Device.Send("Button 1 pressed");
break;
break;
case "button4":
case "button2":
await Device.Send("Button 4 pressed");
await Device.Send("Button 2 pressed");
break;
break;
case "back":
case "button3":
var st = new Menu();
await Device.Send("Button 3 pressed");
await NavigateTo(st);
break;
break;
case "button4":
await Device.Send("Button 4 pressed");
break;
case "back":
var st = new Menu();
await NavigateTo(st);
break;
default:
message.Handled = false;
break;
}
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("Button 1", new CallbackData("a", "button1").Serialize()), new ButtonBase("Button 2", new CallbackData("a", "button2").Serialize()));
btn.AddButtonRow(new ButtonBase("Button 3", new CallbackData("a", "button3").Serialize()), new ButtonBase("Button 4", new CallbackData("a", "button4").Serialize()));
btn.AddButtonRow(new ButtonBase("Google.com", "google", "https://www.google.com"), new ButtonBase("Telegram", "telegram", "https://telegram.org/"));
btn.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "back").Serialize()));
await Device.Send("Click a button", btn);
default:
message.Handled = false;
break;
}
}
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("Button 1", new CallbackData("a", "button1").Serialize()),
new ButtonBase("Button 2", new CallbackData("a", "button2").Serialize()));
btn.AddButtonRow(new ButtonBase("Button 3", new CallbackData("a", "button3").Serialize()),
new ButtonBase("Button 4", new CallbackData("a", "button4").Serialize()));
btn.AddButtonRow(new ButtonBase("Google.com", "google", "https://www.google.com"),
new ButtonBase("Telegram", "telegram", "https://telegram.org/"));
btn.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "back").Serialize()));
await Device.Send("Click a button", btn);
}
}

View File

@ -4,68 +4,66 @@ using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class ButtonGridForm : AutoCleanForm
{
public class ButtonGridForm : AutoCleanForm
private ButtonGrid _mButtons;
public ButtonGridForm()
{
private ButtonGrid _mButtons;
DeleteMode = EDeleteMode.OnLeavingForm;
public ButtonGridForm()
Init += ButtonGridForm_Init;
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
{
_mButtons = new ButtonGrid
{
DeleteMode = EDeleteMode.OnLeavingForm;
KeyboardType = EKeyboardType.InlineKeyBoard
};
Init += ButtonGridForm_Init;
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"), new ButtonBase("Switch Keyboard", "switch"));
bf.AddButtonRow(new ButtonBase("Button1", "b1"), new ButtonBase("Button2", "b2"));
bf.AddButtonRow(new ButtonBase("Button3", "b3"), new ButtonBase("Button4", "b4"));
_mButtons.ButtonsForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
{
return;
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
if (e.Button.Value == "back")
{
_mButtons = new ButtonGrid
var start = new Menu();
await NavigateTo(start);
}
else if (e.Button.Value == "switch")
{
_mButtons.KeyboardType = _mButtons.KeyboardType switch
{
KeyboardType = EKeyboardType.InlineKeyBoard
EKeyboardType.ReplyKeyboard => EKeyboardType.InlineKeyBoard,
EKeyboardType.InlineKeyBoard => EKeyboardType.ReplyKeyboard,
_ => _mButtons.KeyboardType
};
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"), new ButtonBase("Switch Keyboard", "switch"));
bf.AddButtonRow(new ButtonBase("Button1", "b1"), new ButtonBase("Button2", "b2"));
bf.AddButtonRow(new ButtonBase("Button3", "b3"), new ButtonBase("Button4", "b4"));
_mButtons.ButtonsForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
else
{
if (e.Button == null)
return;
if (e.Button.Value == "back")
{
var start = new Menu();
await NavigateTo(start);
}
else if (e.Button.Value == "switch")
{
_mButtons.KeyboardType = _mButtons.KeyboardType switch
{
EKeyboardType.ReplyKeyboard => EKeyboardType.InlineKeyBoard,
EKeyboardType.InlineKeyBoard => EKeyboardType.ReplyKeyboard,
_ => _mButtons.KeyboardType
};
}
else
{
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
}
}
}

View File

@ -6,63 +6,61 @@ using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class ButtonGridPagingForm : AutoCleanForm
{
public class ButtonGridPagingForm : AutoCleanForm
private ButtonGrid _mButtons;
public ButtonGridPagingForm()
{
private ButtonGrid _mButtons;
DeleteMode = EDeleteMode.OnLeavingForm;
public ButtonGridPagingForm()
Init += ButtonGridForm_Init;
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
{
_mButtons = new ButtonGrid
{
DeleteMode = EDeleteMode.OnLeavingForm;
KeyboardType = EKeyboardType.ReplyKeyboard,
EnablePaging = true,
EnableSearch = true,
HeadLayoutButtonRow = new List<ButtonBase> { new("Back", "back") }
};
Init += ButtonGridForm_Init;
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
var bf = new ButtonForm();
foreach (var c in countries)
{
bf.AddButtonRow(new ButtonBase(c.EnglishName, c.EnglishName));
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
_mButtons.ButtonsForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
{
_mButtons = new ButtonGrid
{
KeyboardType = EKeyboardType.ReplyKeyboard,
EnablePaging = true,
EnableSearch = true,
HeadLayoutButtonRow = new List<ButtonBase> { new ButtonBase("Back", "back") }
};
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
var bf = new ButtonForm();
foreach (var c in countries)
{
bf.AddButtonRow(new ButtonBase(c.EnglishName, c.EnglishName));
}
_mButtons.ButtonsForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
return;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
if (e.Button.Value == "back")
{
if (e.Button == null)
return;
if (e.Button.Value == "back")
{
var start = new Menu();
await NavigateTo(start);
}
else
{
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
var start = new Menu();
await NavigateTo(start);
}
else
{
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
}
}
}

View File

@ -8,68 +8,67 @@ using TelegramBotBase.DataSources;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class ButtonGridTagForm : AutoCleanForm
{
public class ButtonGridTagForm : AutoCleanForm
private TaggedButtonGrid _mButtons;
public ButtonGridTagForm()
{
private TaggedButtonGrid _mButtons;
DeleteMode = EDeleteMode.OnLeavingForm;
public ButtonGridTagForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += ButtonGridTagForm_Init;
}
private Task ButtonGridTagForm_Init(object sender, InitEventArgs e)
{
_mButtons = new TaggedButtonGrid
{
KeyboardType = EKeyboardType.ReplyKeyboard,
EnablePaging = true,
HeadLayoutButtonRow = new List<ButtonBase> { new ButtonBase("Back", "back") }
};
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
var bf = new ButtonForm();
foreach (var c in countries)
{
bf.AddButtonRow(new TagButtonBase(c.EnglishName, c.EnglishName, c.Parent.EnglishName));
}
_mButtons.Tags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
_mButtons.SelectedTags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
_mButtons.EnableCheckAllTools = true;
_mButtons.DataSource = new ButtonFormDataSource(bf);
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
return;
switch (e.Button.Value)
{
case "back":
var start = new Menu();
await NavigateTo(start);
return;
}
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
Init += ButtonGridTagForm_Init;
}
}
private Task ButtonGridTagForm_Init(object sender, InitEventArgs e)
{
_mButtons = new TaggedButtonGrid
{
KeyboardType = EKeyboardType.ReplyKeyboard,
EnablePaging = true,
HeadLayoutButtonRow = new List<ButtonBase> { new("Back", "back") }
};
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
var bf = new ButtonForm();
foreach (var c in countries)
{
bf.AddButtonRow(new TagButtonBase(c.EnglishName, c.EnglishName, c.Parent.EnglishName));
}
_mButtons.Tags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
_mButtons.SelectedTags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
_mButtons.EnableCheckAllTools = true;
_mButtons.DataSource = new ButtonFormDataSource(bf);
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
{
return;
}
switch (e.Button.Value)
{
case "back":
var start = new Menu();
await NavigateTo(start);
return;
}
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
}
}

View File

@ -5,75 +5,65 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class CalendarPickerForm : AutoCleanForm
{
public class CalendarPickerForm : AutoCleanForm
public CalendarPickerForm()
{
public CalendarPicker Picker { get; set; }
private int? SelectedDateMessage { get; set; }
public CalendarPickerForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += CalendarPickerForm_Init;
}
private Task CalendarPickerForm_Init(object sender, InitEventArgs e)
{
Picker = new CalendarPicker
{
Title = "Datum auswählen / Pick date"
};
AddControl(Picker);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
switch(message.RawData)
{
case "back":
var s = new Menu();
await NavigateTo(s);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s = "Selected date is " + Picker.SelectedDate.ToShortDateString() + "\r\n";
s += "Selected month is " + Picker.Culture.DateTimeFormat.MonthNames[Picker.VisibleMonth.Month - 1] + "\r\n";
s += "Selected year is " + Picker.VisibleMonth.Year;
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back","back"));
if (SelectedDateMessage != null)
{
await Device.Edit(SelectedDateMessage.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
SelectedDateMessage = m.MessageId;
}
}
DeleteMode = EDeleteMode.OnLeavingForm;
Init += CalendarPickerForm_Init;
}
}
public CalendarPicker Picker { get; set; }
private int? SelectedDateMessage { get; set; }
private Task CalendarPickerForm_Init(object sender, InitEventArgs e)
{
Picker = new CalendarPicker
{
Title = "Datum auswählen / Pick date"
};
AddControl(Picker);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
switch (message.RawData)
{
case "back":
var s = new Menu();
await NavigateTo(s);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s = "Selected date is " + Picker.SelectedDate.ToShortDateString() + "\r\n";
s += "Selected month is " + Picker.Culture.DateTimeFormat.MonthNames[Picker.VisibleMonth.Month - 1] + "\r\n";
s += "Selected year is " + Picker.VisibleMonth.Year;
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
if (SelectedDateMessage != null)
{
await Device.Edit(SelectedDateMessage.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
SelectedDateMessage = m.MessageId;
}
}
}

View File

@ -6,81 +6,81 @@ using TelegramBotBase.DataSources;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class CheckedButtonListForm : AutoCleanForm
{
public class CheckedButtonListForm : AutoCleanForm
private CheckedButtonList _mButtons;
public CheckedButtonListForm()
{
private CheckedButtonList _mButtons;
DeleteMode = EDeleteMode.OnLeavingForm;
public CheckedButtonListForm()
Init += CheckedButtonListForm_Init;
}
private Task CheckedButtonListForm_Init(object sender, InitEventArgs e)
{
_mButtons = new CheckedButtonList
{
DeleteMode = EDeleteMode.OnLeavingForm;
KeyboardType = EKeyboardType.InlineKeyBoard,
EnablePaging = true,
HeadLayoutButtonRow = new List<ButtonBase> { new("Back", "back"), new("Switch Keyboard", "switch") },
SubHeadLayoutButtonRow = new List<ButtonBase> { new("No checked items", "$") }
};
Init += CheckedButtonListForm_Init;
var bf = new ButtonForm();
for (var i = 0; i < 30; i++)
{
bf.AddButtonRow($"{i + 1}. Item", i.ToString());
}
private Task CheckedButtonListForm_Init(object sender, InitEventArgs e)
_mButtons.DataSource = new ButtonFormDataSource(bf);
_mButtons.ButtonClicked += Bg_ButtonClicked;
_mButtons.CheckedChanged += M_Buttons_CheckedChanged;
AddControl(_mButtons);
return Task.CompletedTask;
}
private Task M_Buttons_CheckedChanged(object sender, CheckedChangedEventArgs e)
{
_mButtons.SubHeadLayoutButtonRow = new List<ButtonBase>
{ new($"{_mButtons.CheckedItems.Count} checked items", "$") };
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
{
_mButtons = new CheckedButtonList
{
KeyboardType = EKeyboardType.InlineKeyBoard,
EnablePaging = true,
HeadLayoutButtonRow = new List<ButtonBase> { new ButtonBase("Back", "back"), new ButtonBase("Switch Keyboard", "switch") },
SubHeadLayoutButtonRow = new List<ButtonBase> { new ButtonBase("No checked items", "$") }
};
var bf = new ButtonForm();
for (var i = 0; i < 30; i++)
{
bf.AddButtonRow($"{i + 1}. Item", i.ToString());
}
_mButtons.DataSource = new ButtonFormDataSource(bf);
_mButtons.ButtonClicked += Bg_ButtonClicked;
_mButtons.CheckedChanged += M_Buttons_CheckedChanged;
AddControl(_mButtons);
return Task.CompletedTask;
return;
}
private Task M_Buttons_CheckedChanged(object sender, CheckedChangedEventArgs e)
switch (e.Button.Value)
{
_mButtons.SubHeadLayoutButtonRow = new List<ButtonBase> { new ButtonBase($"{_mButtons.CheckedItems.Count} checked items", "$") };
return Task.CompletedTask;
}
case "back":
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
if (e.Button == null)
return;
switch (e.Button.Value)
{
case "back":
var start = new Menu();
await NavigateTo(start);
break;
var start = new Menu();
await NavigateTo(start);
break;
case "switch":
_mButtons.KeyboardType = _mButtons.KeyboardType switch
{
EKeyboardType.ReplyKeyboard => EKeyboardType.InlineKeyBoard,
EKeyboardType.InlineKeyBoard => EKeyboardType.ReplyKeyboard,
_ => _mButtons.KeyboardType
};
break;
default:
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
break;
}
case "switch":
_mButtons.KeyboardType = _mButtons.KeyboardType switch
{
EKeyboardType.ReplyKeyboard => EKeyboardType.InlineKeyBoard,
EKeyboardType.InlineKeyBoard => EKeyboardType.ReplyKeyboard,
_ => _mButtons.KeyboardType
};
break;
default:
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
break;
}
}
}
}

View File

@ -5,73 +5,63 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class MonthPickerForm : AutoCleanForm
{
public class MonthPickerForm : AutoCleanForm
public MonthPickerForm()
{
public MonthPicker Picker { get; set; }
private int? SelectedDateMessage { get; set; }
public MonthPickerForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += MonthPickerForm_Init;
}
private Task MonthPickerForm_Init(object sender, InitEventArgs e)
{
Picker = new MonthPicker
{
Title = "Monat auswählen / Pick month"
};
AddControl(Picker);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
switch(message.RawData)
{
case "back":
var s = new Menu();
await NavigateTo(s);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s += "Selected month is " + Picker.Culture.DateTimeFormat.MonthNames[Picker.SelectedDate.Month - 1] + "\r\n";
s += "Selected year is " + Picker.VisibleMonth.Year;
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back","back"));
if (SelectedDateMessage != null)
{
await Device.Edit(SelectedDateMessage.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
SelectedDateMessage = m.MessageId;
}
}
DeleteMode = EDeleteMode.OnLeavingForm;
Init += MonthPickerForm_Init;
}
}
public MonthPicker Picker { get; set; }
private int? SelectedDateMessage { get; set; }
private Task MonthPickerForm_Init(object sender, InitEventArgs e)
{
Picker = new MonthPicker
{
Title = "Monat auswählen / Pick month"
};
AddControl(Picker);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
switch (message.RawData)
{
case "back":
var s = new Menu();
await NavigateTo(s);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s += "Selected month is " + Picker.Culture.DateTimeFormat.MonthNames[Picker.SelectedDate.Month - 1] + "\r\n";
s += "Selected year is " + Picker.VisibleMonth.Year;
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
if (SelectedDateMessage != null)
{
await Device.Edit(SelectedDateMessage.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
SelectedDateMessage = m.MessageId;
}
}
}

View File

@ -7,51 +7,49 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class MultiToggleButtons : AutoCleanForm
{
public class MultiToggleButtons : AutoCleanForm
public MultiToggleButtons()
{
public MultiToggleButtons()
{
DeleteMode = EDeleteMode.OnLeavingForm;
DeleteMode = EDeleteMode.OnLeavingForm;
Init += ToggleButtons_Init;
}
private Task ToggleButtons_Init(object sender, InitEventArgs e)
{
var mtb = new MultiToggleButton
{
Options = new List<ButtonBase> { new ButtonBase("Option 1", "1"), new ButtonBase("Option 2", "2"), new ButtonBase("Option 3", "3") }
};
mtb.SelectedOption = mtb.Options.FirstOrDefault();
mtb.Toggled += Tb_Toggled;
AddControl(mtb);
mtb = new MultiToggleButton
{
Options = new List<ButtonBase> { new ButtonBase("Option 4", "4"), new ButtonBase("Option 5", "5"), new ButtonBase("Option 6", "6") }
};
mtb.SelectedOption = mtb.Options.FirstOrDefault();
mtb.AllowEmptySelection = false;
mtb.Toggled += Tb_Toggled;
AddControl(mtb);
return Task.CompletedTask;
}
private void Tb_Toggled(object sender, EventArgs e)
{
var tb = sender as MultiToggleButton;
if (tb.SelectedOption != null)
{
Console.WriteLine(tb.Id + " was pressed, and toggled to " + tb.SelectedOption.Value);
return;
}
Console.WriteLine("Selection for " + tb.Id + " has been removed.");
}
Init += ToggleButtons_Init;
}
}
private Task ToggleButtons_Init(object sender, InitEventArgs e)
{
var mtb = new MultiToggleButton
{
Options = new List<ButtonBase> { new("Option 1", "1"), new("Option 2", "2"), new("Option 3", "3") }
};
mtb.SelectedOption = mtb.Options.FirstOrDefault();
mtb.Toggled += Tb_Toggled;
AddControl(mtb);
mtb = new MultiToggleButton
{
Options = new List<ButtonBase> { new("Option 4", "4"), new("Option 5", "5"), new("Option 6", "6") }
};
mtb.SelectedOption = mtb.Options.FirstOrDefault();
mtb.AllowEmptySelection = false;
mtb.Toggled += Tb_Toggled;
AddControl(mtb);
return Task.CompletedTask;
}
private void Tb_Toggled(object sender, EventArgs e)
{
var tb = sender as MultiToggleButton;
if (tb.SelectedOption != null)
{
Console.WriteLine(tb.Id + " was pressed, and toggled to " + tb.SelectedOption.Value);
return;
}
Console.WriteLine("Selection for " + tb.Id + " has been removed.");
}
}

View File

@ -5,50 +5,46 @@ using TelegramBotBase.Enums;
using TelegramBotBase.Form;
using TelegramBotBaseTest.Tests.Controls.Subclass;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class MultiViewForm : AutoCleanForm
{
public class MultiViewForm : AutoCleanForm
private ButtonGrid _bg;
private MultiViewTest _mvt;
public MultiViewForm()
{
private MultiViewTest _mvt;
private ButtonGrid _bg;
public MultiViewForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += MultiViewForm_Init;
}
private Task MultiViewForm_Init(object sender, InitEventArgs e)
{
_mvt = new MultiViewTest();
AddControl(_mvt);
_bg = new ButtonGrid
{
ButtonsForm = new ButtonForm()
};
_bg.ButtonsForm.AddButtonRow("Back", "$back$");
_bg.ButtonClicked += Bg_ButtonClicked;
_bg.KeyboardType = EKeyboardType.ReplyKeyboard;
AddControl(_bg);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
switch(e.Button.Value)
{
case "$back$":
var mn = new Menu();
await NavigateTo(mn);
break;
}
}
DeleteMode = EDeleteMode.OnLeavingForm;
Init += MultiViewForm_Init;
}
}
private Task MultiViewForm_Init(object sender, InitEventArgs e)
{
_mvt = new MultiViewTest();
AddControl(_mvt);
_bg = new ButtonGrid
{
ButtonsForm = new ButtonForm()
};
_bg.ButtonsForm.AddButtonRow("Back", "$back$");
_bg.ButtonClicked += Bg_ButtonClicked;
_bg.KeyboardType = EKeyboardType.ReplyKeyboard;
AddControl(_bg);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
switch (e.Button.Value)
{
case "$back$":
var mn = new Menu();
await NavigateTo(mn);
break;
}
}
}

View File

@ -4,59 +4,49 @@ using TelegramBotBase.Base;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls.Subclass
namespace TelegramBotBaseTest.Tests.Controls.Subclass;
public class MultiViewTest : MultiView
{
public class MultiViewTest : MultiView
public override Task Action(MessageResult result, string value = null)
{
public override Task Action(MessageResult result, string value = null)
switch (result.RawData)
{
switch (result.RawData)
{
case "back":
case "back":
SelectedViewIndex--;
SelectedViewIndex--;
break;
case "next":
break;
case "next":
SelectedViewIndex++;
SelectedViewIndex++;
break;
}
return Task.CompletedTask;
break;
}
public override async Task RenderView(RenderViewEventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"), new ButtonBase("Next", "next"));
switch (e.CurrentView)
{
case 0:
case 1:
case 2:
await Device.Send($"Page {e.CurrentView + 1}", bf);
break;
default:
await Device.Send("Unknown Page", bf);
break;
}
}
return Task.CompletedTask;
}
}
public override async Task RenderView(RenderViewEventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"), new ButtonBase("Next", "next"));
switch (e.CurrentView)
{
case 0:
case 1:
case 2:
await Device.Send($"Page {e.CurrentView + 1}", bf);
break;
default:
await Device.Send("Unknown Page", bf);
break;
}
}
}

View File

@ -5,50 +5,48 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class ToggleButtons : AutoCleanForm
{
public class ToggleButtons : AutoCleanForm
public ToggleButtons()
{
public ToggleButtons()
{
DeleteMode = EDeleteMode.OnLeavingForm;
DeleteMode = EDeleteMode.OnLeavingForm;
Init += ToggleButtons_Init;
}
private Task ToggleButtons_Init(object sender, InitEventArgs e)
{
var tb = new ToggleButton
{
Checked = true
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
tb = new ToggleButton
{
Checked = false
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
tb = new ToggleButton
{
Checked = true
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
return Task.CompletedTask;
}
private void Tb_Toggled(object sender, EventArgs e)
{
var tb = sender as ToggleButton;
Console.WriteLine(tb.Id + " was pressed, and toggled to " + (tb.Checked ? "Checked" : "Unchecked"));
}
Init += ToggleButtons_Init;
}
}
private Task ToggleButtons_Init(object sender, InitEventArgs e)
{
var tb = new ToggleButton
{
Checked = true
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
tb = new ToggleButton
{
Checked = false
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
tb = new ToggleButton
{
Checked = true
};
tb.Toggled += Tb_Toggled;
AddControl(tb);
return Task.CompletedTask;
}
private void Tb_Toggled(object sender, EventArgs e)
{
var tb = sender as ToggleButton;
Console.WriteLine(tb.Id + " was pressed, and toggled to " + (tb.Checked ? "Checked" : "Unchecked"));
}
}

View File

@ -5,93 +5,94 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Controls
namespace TelegramBotBaseTest.Tests.Controls;
public class TreeViewForms : AutoCleanForm
{
public class TreeViewForms : AutoCleanForm
public TreeViewForms()
{
public TreeView View { get; set; }
private int? MessageId { get; set; }
public TreeViewForms()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += TreeViewForms_Init;
}
private Task TreeViewForms_Init(object sender, InitEventArgs e)
{
View = new TreeView();
var tvn = new TreeViewNode("Cars", "cars");
tvn.AddNode(new TreeViewNode("Porsche", "porsche", new TreeViewNode("Website", "web", "https://www.porsche.com/germany/"), new TreeViewNode("911", "911"), new TreeViewNode("918 Spyder", "918")));
tvn.AddNode(new TreeViewNode("BMW", "bmw"));
tvn.AddNode(new TreeViewNode("Audi", "audi"));
tvn.AddNode(new TreeViewNode("VW", "vw"));
tvn.AddNode(new TreeViewNode("Lamborghini", "lamborghini"));
View.Nodes.Add(tvn);
tvn = new TreeViewNode("Fruits", "fruits");
tvn.AddNode(new TreeViewNode("Apple", "apple"));
tvn.AddNode(new TreeViewNode("Orange", "orange"));
tvn.AddNode(new TreeViewNode("Lemon", "lemon"));
View.Nodes.Add(tvn);
AddControl(View);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
if (message.Handled)
return;
switch (message.RawData)
{
case "back":
message.Handled = true;
var start = new Menu();
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s += "Selected Node: " + (View.SelectedNode?.Text ?? "(null)") + "\r\n";
s += "Visible Node: " + (View.VisibleNode?.Text ?? "(top)") + "\r\n";
s += "Visible Path: " + View.GetPath() + "\r\n";
s += "Selected Path: " + (View.SelectedNode?.GetPath() ?? "(null)") + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
if (MessageId != null)
{
await Device.Edit(MessageId.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
MessageId = m.MessageId;
}
}
DeleteMode = EDeleteMode.OnLeavingForm;
Init += TreeViewForms_Init;
}
}
public TreeView View { get; set; }
private int? MessageId { get; set; }
private Task TreeViewForms_Init(object sender, InitEventArgs e)
{
View = new TreeView();
var tvn = new TreeViewNode("Cars", "cars");
tvn.AddNode(new TreeViewNode("Porsche", "porsche",
new TreeViewNode("Website", "web", "https://www.porsche.com/germany/"),
new TreeViewNode("911", "911"),
new TreeViewNode("918 Spyder", "918")));
tvn.AddNode(new TreeViewNode("BMW", "bmw"));
tvn.AddNode(new TreeViewNode("Audi", "audi"));
tvn.AddNode(new TreeViewNode("VW", "vw"));
tvn.AddNode(new TreeViewNode("Lamborghini", "lamborghini"));
View.Nodes.Add(tvn);
tvn = new TreeViewNode("Fruits", "fruits");
tvn.AddNode(new TreeViewNode("Apple", "apple"));
tvn.AddNode(new TreeViewNode("Orange", "orange"));
tvn.AddNode(new TreeViewNode("Lemon", "lemon"));
View.Nodes.Add(tvn);
AddControl(View);
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
if (message.Handled)
{
return;
}
switch (message.RawData)
{
case "back":
message.Handled = true;
var start = new Menu();
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
var s = "";
s += "Selected Node: " + (View.SelectedNode?.Text ?? "(null)") + "\r\n";
s += "Visible Node: " + (View.VisibleNode?.Text ?? "(top)") + "\r\n";
s += "Visible Path: " + View.GetPath() + "\r\n";
s += "Selected Path: " + (View.SelectedNode?.GetPath() ?? "(null)") + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
if (MessageId != null)
{
await Device.Edit(MessageId.Value, s, bf);
}
else
{
var m = await Device.Send(s, bf);
MessageId = m.MessageId;
}
}
}

View File

@ -7,134 +7,126 @@ using Telegram.Bot.Types.ReplyMarkups;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class DataForm : AutoCleanForm
{
public class DataForm : AutoCleanForm
public override async Task SentData(DataResult data)
{
var tmp = "";
InputOnlineFile file;
public override async Task SentData(DataResult data)
switch (data.Type)
{
var tmp = "";
InputOnlineFile file;
case MessageType.Contact:
switch (data.Type)
{
case MessageType.Contact:
tmp += "Firstname: " + data.Contact.FirstName + "\r\n";
tmp += "Lastname: " + data.Contact.LastName + "\r\n";
tmp += "Phonenumber: " + data.Contact.PhoneNumber + "\r\n";
tmp += "UserId: " + data.Contact.UserId + "\r\n";
tmp += "Firstname: " + data.Contact.FirstName + "\r\n";
tmp += "Lastname: " + data.Contact.LastName + "\r\n";
tmp += "Phonenumber: " + data.Contact.PhoneNumber + "\r\n";
tmp += "UserId: " + data.Contact.UserId + "\r\n";
await Device.Send("Your contact: \r\n" + tmp, replyTo: data.MessageId);
await Device.Send("Your contact: \r\n" + tmp, replyTo: data.MessageId);
break;
break;
case MessageType.Document:
case MessageType.Document:
file = new InputOnlineFile(data.Document.FileId);
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded document");
await Device.SendDocument(file, "Your uploaded document");
break;
break;
case MessageType.Video:
case MessageType.Video:
file = new InputOnlineFile(data.Document.FileId);
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded video");
await Device.SendDocument(file, "Your uploaded video");
break;
break;
case MessageType.Audio:
case MessageType.Audio:
file = new InputOnlineFile(data.Document.FileId);
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded audio");
await Device.SendDocument(file, "Your uploaded audio");
break;
break;
case MessageType.Location:
case MessageType.Location:
tmp += "Lat: " + data.Location.Latitude + "\r\n";
tmp += "Lng: " + data.Location.Longitude + "\r\n";
tmp += "Lat: " + data.Location.Latitude + "\r\n";
tmp += "Lng: " + data.Location.Longitude + "\r\n";
await Device.Send("Your location: \r\n" + tmp, replyTo: data.MessageId);
await Device.Send("Your location: \r\n" + tmp, replyTo: data.MessageId);
break;
break;
case MessageType.Photo:
case MessageType.Photo:
var photo = new InputOnlineFile(data.Photos.Last().FileId);
var photo = new InputOnlineFile(data.Photos.Last().FileId);
await Device.Send("Your image: ", replyTo: data.MessageId);
await Client.TelegramClient.SendPhotoAsync(Device.DeviceId, photo);
await Device.Send("Your image: ", replyTo: data.MessageId);
await Client.TelegramClient.SendPhotoAsync(Device.DeviceId, photo);
break;
break;
default:
default:
await Device.Send("Unknown response");
await Device.Send("Unknown response");
break;
}
break;
}
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
if (message.Handled)
{
return;
}
public override async Task Action(MessageResult message)
switch (message.RawData)
{
await message.ConfirmAction();
case "contact":
if (message.Handled)
return;
await Device.RequestContact();
switch (message.RawData)
{
case "contact":
break;
await Device.RequestContact();
case "location":
break;
await Device.RequestLocation();
case "location":
break;
await Device.RequestLocation();
case "back":
break;
message.Handled = true;
case "back":
message.Handled = true;
var start = new Menu();
await NavigateTo(start);
break;
}
var start = new Menu();
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Request User contact", "contact"));
bf.AddButtonRow(new ButtonBase("Request User contact", "contact"));
bf.AddButtonRow(new ButtonBase("Request User location", "location"));
bf.AddButtonRow(new ButtonBase("Request User location", "location"));
bf.AddButtonRow(new ButtonBase("Back", "back"));
bf.AddButtonRow(new ButtonBase("Back", "back"));
InlineKeyboardMarkup ikv = bf;
await Device.Send("Please upload a contact, photo, video, audio, document or location.", bf);
}
InlineKeyboardMarkup ikv = bf;
await Device.Send("Please upload a contact, photo, video, audio, document or location.", bf);
}
}

View File

@ -0,0 +1,146 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.DataSources;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.DataSources;
public class CustomDataSource : ButtonFormDataSource
{
public List<string> Countries = new() { "Country 1", "Country 2", "Country 3" };
public CustomDataSource()
{
LoadData();
}
public override int Count => Countries.Count;
public override int ColumnCount => 1;
public override int RowCount => Count;
/// <summary>
/// This method has the example purpose of creating and loading some example data.
/// When using a database you do not need this kind of method.
/// </summary>
private void LoadData()
{
//Exists data source? Read it
if (File.Exists(AppContext.BaseDirectory + "countries.json"))
{
try
{
var list = JsonConvert.DeserializeObject<List<string>>(File.ReadAllText("countries.json"));
Countries = list;
}
catch
{
}
return;
}
//If not, create it
try
{
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(a => a.DisplayName).ToList();
Countries = countries;
var tmp = JsonConvert.SerializeObject(countries);
File.WriteAllText(AppContext.BaseDirectory + "countries.json", tmp);
}
catch
{
}
}
public override ButtonRow ItemAt(int index)
{
var item = Countries.ElementAt(index);
if (item == null)
{
return new ButtonRow();
}
return Render(item);
}
public override List<ButtonRow> ItemRange(int start, int count)
{
var items = Countries.Skip(start).Take(count);
var lst = new List<ButtonRow>();
foreach (var c in items)
{
lst.Add(Render(c));
}
return lst;
}
public override List<ButtonRow> AllItems()
{
var lst = new List<ButtonRow>();
foreach (var c in Countries)
{
lst.Add(Render(c));
}
return lst;
}
public override ButtonForm PickItems(int start, int count, string filter = null)
{
var rows = ItemRange(start, count);
var lst = new ButtonForm();
foreach (var c in rows)
{
lst.AddButtonRow(c);
}
return lst;
}
public override ButtonForm PickAllItems(string filter = null)
{
var rows = AllItems();
var bf = new ButtonForm();
bf.AddButtonRows(rows);
return bf;
}
public override int CalculateMax(string filter = null)
{
if (filter == null)
{
return Countries.Count;
}
return Countries.Where(a => a.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) != -1).Count();
}
public override ButtonRow Render(object data)
{
if (!(data is string s))
{
return new ButtonRow(new ButtonBase("Empty", "zero"));
}
return new ButtonRow(new ButtonBase(s, s));
}
}

View File

@ -0,0 +1,51 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.DataSources;
public class List : FormBase
{
private ButtonGrid _buttons;
public List()
{
Init += List_Init;
}
private Task List_Init(object sender, InitEventArgs e)
{
_buttons = new ButtonGrid
{
EnablePaging = true,
EnableSearch = false
};
_buttons.ButtonClicked += __buttons_ButtonClicked;
_buttons.KeyboardType = EKeyboardType.ReplyKeyboard;
_buttons.DeleteReplyMessage = true;
_buttons.HeadLayoutButtonRow = new ButtonRow(new ButtonBase("Back", "back"));
var cds = new CustomDataSource();
_buttons.DataSource = cds;
AddControl(_buttons);
return Task.CompletedTask;
}
private async Task __buttons_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
switch (e.Button.Value)
{
case "back":
var mn = new Menu();
await NavigateTo(mn);
break;
}
}
}

View File

@ -1,143 +0,0 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.DataSources;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Datasources
{
public class CustomDataSource : ButtonFormDataSource
{
public List<string> Countries = new List<string> { "Country 1", "Country 2", "Country 3" };
public CustomDataSource()
{
LoadData();
}
/// <summary>
/// This method has the example purpose of creating and loading some example data.
/// When using a database you do not need this kind of method.
/// </summary>
private void LoadData()
{
//Exists data source? Read it
if (File.Exists(AppContext.BaseDirectory + "countries.json"))
{
try
{
var list = JsonConvert.DeserializeObject<List<string>>(File.ReadAllText("countries.json"));
Countries = list;
}
catch
{
}
return;
}
//If not, create it
try
{
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures).Select(a => a.DisplayName).ToList();
Countries = countries;
var tmp = JsonConvert.SerializeObject(countries);
File.WriteAllText( AppContext.BaseDirectory + "countries.json", tmp);
}
catch
{
}
}
public override ButtonRow ItemAt(int index)
{
var item = Countries.ElementAt(index);
if (item == null)
return new ButtonRow();
return Render(item);
}
public override List<ButtonRow> ItemRange(int start, int count)
{
var items = Countries.Skip(start).Take(count);
var lst = new List<ButtonRow>();
foreach (var c in items)
{
lst.Add(Render(c));
}
return lst;
}
public override List<ButtonRow> AllItems()
{
var lst = new List<ButtonRow>();
foreach (var c in Countries)
{
lst.Add(Render(c));
}
return lst;
}
public override ButtonForm PickItems(int start, int count, string filter = null)
{
var rows = ItemRange(start, count);
var lst = new ButtonForm();
foreach (var c in rows)
{
lst.AddButtonRow(c);
}
return lst;
}
public override ButtonForm PickAllItems(string filter = null)
{
var rows = AllItems();
var bf = new ButtonForm();
bf.AddButtonRows(rows);
return bf;
}
public override int CalculateMax(string filter = null)
{
if (filter == null)
return Countries.Count;
return Countries.Where(a => a.IndexOf(filter, StringComparison.InvariantCultureIgnoreCase) != -1).Count();
}
public override ButtonRow Render(object data)
{
if (!(data is string s))
return new ButtonRow(new ButtonBase("Empty", "zero"));
return new ButtonRow(new ButtonBase(s, s));
}
public override int Count => Countries.Count;
public override int ColumnCount => 1;
public override int RowCount => Count;
}
}

View File

@ -1,55 +0,0 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Datasources
{
public class List : FormBase
{
private ButtonGrid _buttons;
public List()
{
Init += List_Init;
}
private Task List_Init(object sender, InitEventArgs e)
{
_buttons = new ButtonGrid
{
EnablePaging = true,
EnableSearch = false
};
_buttons.ButtonClicked += __buttons_ButtonClicked;
_buttons.KeyboardType = EKeyboardType.ReplyKeyboard;
_buttons.DeleteReplyMessage = true;
_buttons.HeadLayoutButtonRow = new ButtonRow(new ButtonBase("Back", "back"));
var cds = new CustomDataSource();
_buttons.DataSource = cds;
AddControl(_buttons);
return Task.CompletedTask;
}
private async Task __buttons_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
switch(e.Button.Value)
{
case "back":
var mn = new Menu();
await NavigateTo(mn);
break;
}
}
}
}

View File

@ -4,71 +4,69 @@ using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Groups
namespace TelegramBotBaseTest.Tests.Groups;
public class GroupChange : GroupForm
{
public class GroupChange : GroupForm
public GroupChange()
{
public GroupChange()
{
Opened += GroupChange_Opened;
}
private async Task GroupChange_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("GroupChange started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnGroupChanged(GroupChangedEventArgs e)
{
await Device.Send("Group has been changed by " + e.OriginalMessage.Message.From.FirstName + " " + e.OriginalMessage.Message.From.LastName);
}
Opened += GroupChange_Opened;
}
}
private async Task GroupChange_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("GroupChange started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnGroupChanged(GroupChangedEventArgs e)
{
await Device.Send("Group has been changed by " + e.OriginalMessage.Message.From.FirstName + " " +
e.OriginalMessage.Message.From.LastName);
}
}

View File

@ -7,159 +7,159 @@ using Telegram.Bot.Types.Enums;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Groups
namespace TelegramBotBaseTest.Tests.Groups;
public class LinkReplaceTest : GroupForm
{
public class LinkReplaceTest : GroupForm
private const int Maximum = 3;
public LinkReplaceTest()
{
private Dictionary<long, int> Counter { get; set; } = new Dictionary<long, int>();
private const int Maximum = 3;
public LinkReplaceTest()
{
Opened += LinkReplaceTest_Opened;
}
private async Task LinkReplaceTest_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("LinkReplaceTest started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnMessage(MessageResult e)
{
var from = e.Message.From.Id;
if (e.Message.From.IsBot)
return;
//Are urls inside his message ?
if (!HasLinks(e.MessageText))
return;
var u = await Device.GetChatUser(from);
//Don't kick Admins or Creators
if (u.Status == ChatMemberStatus.Administrator | u.Status == ChatMemberStatus.Creator)
{
await Device.Send("You won't get kicked,...not this time.");
return;
}
await e.Device.DeleteMessage(e.MessageId);
var cp = new ChatPermissions
{
CanAddWebPagePreviews = false,
CanChangeInfo = false,
CanInviteUsers = false,
CanPinMessages = false,
CanSendMediaMessages = false,
CanSendMessages = false,
CanSendOtherMessages = false,
CanSendPolls = false
};
//Collect user "mistakes" with sending url, after 3 he gets kicked out.
if (Counter.ContainsKey(from))
{
Counter[from]++;
}
else
{
Counter[from] = 1;
}
if (Counter[from] >= 3)
{
await e.Device.KickUser(from);
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName + " has been removed from the group");
}
else
{
await e.Device.RestrictUser(from, cp, DateTime.UtcNow.AddSeconds(30));
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName + " has been blocked for 30 seconds");
}
}
/// <summary>
/// Call onmessage also on edited message, if someone want to spoof a failed message and insert a link.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public override async Task OnMessageEdit(MessageResult message)
{
await OnMessage(message);
}
/// <summary>
/// https://stackoverflow.com/a/20651284
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private bool HasLinks(string str)
{
var tmp = str;
var pattern = @"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$";
var r = new Regex(pattern);
var matches = r.Matches(tmp);
return (matches.Count > 0);
}
Opened += LinkReplaceTest_Opened;
}
}
private Dictionary<long, int> Counter { get; } = new();
private async Task LinkReplaceTest_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("LinkReplaceTest started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnMessage(MessageResult e)
{
var from = e.Message.From.Id;
if (e.Message.From.IsBot)
{
return;
}
//Are urls inside his message ?
if (!HasLinks(e.MessageText))
{
return;
}
var u = await Device.GetChatUser(from);
//Don't kick Admins or Creators
if ((u.Status == ChatMemberStatus.Administrator) | (u.Status == ChatMemberStatus.Creator))
{
await Device.Send("You won't get kicked,...not this time.");
return;
}
await e.Device.DeleteMessage(e.MessageId);
var cp = new ChatPermissions
{
CanAddWebPagePreviews = false,
CanChangeInfo = false,
CanInviteUsers = false,
CanPinMessages = false,
CanSendMediaMessages = false,
CanSendMessages = false,
CanSendOtherMessages = false,
CanSendPolls = false
};
//Collect user "mistakes" with sending url, after 3 he gets kicked out.
if (Counter.ContainsKey(from))
{
Counter[from]++;
}
else
{
Counter[from] = 1;
}
if (Counter[from] >= 3)
{
await e.Device.KickUser(from);
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName +
" has been removed from the group");
}
else
{
await e.Device.RestrictUser(from, cp, DateTime.UtcNow.AddSeconds(30));
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName +
" has been blocked for 30 seconds");
}
}
/// <summary>
/// Call onmessage also on edited message, if someone want to spoof a failed message and insert a link.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public override async Task OnMessageEdit(MessageResult message)
{
await OnMessage(message);
}
/// <summary>
/// https://stackoverflow.com/a/20651284
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private bool HasLinks(string str)
{
var tmp = str;
var pattern =
@"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$";
var r = new Regex(pattern);
var matches = r.Matches(tmp);
return matches.Count > 0;
}
}

View File

@ -6,86 +6,77 @@ using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Groups
namespace TelegramBotBaseTest.Tests.Groups;
public class WelcomeUser : GroupForm
{
public class WelcomeUser : GroupForm
public WelcomeUser()
{
public WelcomeUser()
{
Opened += WelcomeUser_Opened;
}
private async Task WelcomeUser_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("WelcomeUser started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnMemberChanges(MemberChangeEventArgs e)
{
if (e.Type == MessageType.ChatMembersAdded)
{
await Device.Send("Welcome you new members!\r\n\r\n" + e.Members.Select(a => a.FirstName + " " + a.LastName).Aggregate((a, b) => a + "\r\n" + b));
}
else if (e.Type == MessageType.ChatMemberLeft)
{
await Device.Send(e.Members.Select(a => a.FirstName + " " + a.LastName).Aggregate((a, b) => a + " and " + b) + " has left the group");
}
}
Opened += WelcomeUser_Opened;
}
}
private async Task WelcomeUser_Opened(object sender, EventArgs e)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Open GroupChange Test", "groupchange"));
bf.AddButtonRow(new ButtonBase("Open WelcomeUser Test", "welcomeuser"));
bf.AddButtonRow(new ButtonBase("Open LinkReplace Test", "linkreplace"));
await Device.Send("WelcomeUser started, click to switch", bf);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
var bn = message.RawData;
await message.ConfirmAction();
message.Handled = true;
switch (bn)
{
case "groupchange":
var gc = new GroupChange();
await NavigateTo(gc);
break;
case "welcomeuser":
var wu = new WelcomeUser();
await NavigateTo(wu);
break;
case "linkreplace":
var lr = new LinkReplaceTest();
await NavigateTo(lr);
break;
}
}
public override async Task OnMemberChanges(MemberChangeEventArgs e)
{
if (e.Type == MessageType.ChatMembersAdded)
{
await Device.Send("Welcome you new members!\r\n\r\n" + e.Members.Select(a => a.FirstName + " " + a.LastName)
.Aggregate((a, b) => a + "\r\n" + b));
}
else if (e.Type == MessageType.ChatMemberLeft)
{
await Device.Send(
e.Members.Select(a => a.FirstName + " " + a.LastName).Aggregate((a, b) => a + " and " + b) +
" has left the group");
}
}
}

View File

@ -4,261 +4,262 @@ using TelegramBotBase.Base;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
using TelegramBotBaseTest.Tests.Controls;
using TelegramBotBaseTest.Tests.Datasources;
using TelegramBotBaseTest.Tests.DataSources;
using TelegramBotBaseTest.Tests.Groups;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class Menu : AutoCleanForm
{
public class Menu : AutoCleanForm
public Menu()
{
public Menu()
DeleteMode = EDeleteMode.OnLeavingForm;
}
public override async Task Load(MessageResult message)
{
if ((message.Message.Chat.Type == ChatType.Group) | (message.Message.Chat.Type == ChatType.Supergroup))
{
DeleteMode = EDeleteMode.OnLeavingForm;
var sf = new WelcomeUser();
await NavigateTo(sf);
}
public override async Task Load(MessageResult message)
await Device.HideReplyKeyboard();
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
{
return;
}
message.Handled = true;
if (message.Message.Chat.Type == ChatType.Group | message.Message.Chat.Type == ChatType.Supergroup)
{
var sf = new WelcomeUser();
switch (call.Value)
{
case "text":
var sf = new SimpleForm();
await NavigateTo(sf);
}
break;
case "buttons":
var bf = new ButtonTestForm();
await NavigateTo(bf);
break;
case "progress":
var pf = new ProgressTest();
await NavigateTo(pf);
break;
case "registration":
var reg = new Register.Start();
await NavigateTo(reg);
break;
case "form1":
var form1 = new TestForm();
await NavigateTo(form1);
break;
case "form2":
var form2 = new TestForm2();
await NavigateTo(form2);
break;
case "data":
var data = new DataForm();
await NavigateTo(data);
break;
case "calendar":
var calendar = new CalendarPickerForm();
await NavigateTo(calendar);
break;
case "month":
var month = new MonthPickerForm();
await NavigateTo(month);
break;
case "treeview":
var tree = new TreeViewForms();
await NavigateTo(tree);
break;
case "togglebuttons":
var tb = new ToggleButtons();
await NavigateTo(tb);
break;
case "multitogglebuttons":
var mtb = new MultiToggleButtons();
await NavigateTo(mtb);
break;
case "buttongrid":
var bg = new ButtonGridForm();
await NavigateTo(bg);
break;
case "buttongridfilter":
var bg2 = new ButtonGridPagingForm();
await NavigateTo(bg2);
break;
case "buttongridtags":
var bg3 = new ButtonGridTagForm();
await NavigateTo(bg3);
break;
case "multiview":
var mvf = new MultiViewForm();
await NavigateTo(mvf);
await Device.HideReplyKeyboard();
break;
case "checkedbuttonlist":
var cbl = new CheckedButtonListForm();
await NavigateTo(cbl);
break;
case "navigationcontroller":
var nc = new Navigation.Start();
await NavigateTo(nc);
break;
case "dynamicbuttongrid":
var dg = new List();
await NavigateTo(dg);
break;
case "notifications":
var not = new Notifications.Start();
await NavigateTo(not);
break;
default:
message.Handled = false;
break;
}
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
await message.ConfirmAction();
btn.AddButtonRow(new ButtonBase("#1 Simple Text", new CallbackData("a", "text").Serialize()),
new ButtonBase("#2 Button Test", new CallbackData("a", "buttons").Serialize()));
btn.AddButtonRow(new ButtonBase("#3 Progress Bar", new CallbackData("a", "progress").Serialize()));
btn.AddButtonRow(new ButtonBase("#4 Registration Example", new CallbackData("a", "registration").Serialize()));
btn.AddButtonRow(new ButtonBase("#5 Form1 Command", new CallbackData("a", "form1").Serialize()));
if (call == null)
return;
btn.AddButtonRow(new ButtonBase("#6 Form2 Command", new CallbackData("a", "form2").Serialize()));
message.Handled = true;
btn.AddButtonRow(new ButtonBase("#7 Data Handling", new CallbackData("a", "data").Serialize()));
btn.AddButtonRow(new ButtonBase("#8 Calendar Picker", new CallbackData("a", "calendar").Serialize()));
btn.AddButtonRow(new ButtonBase("#9 Month Picker", new CallbackData("a", "month").Serialize()));
switch (call.Value)
{
case "text":
btn.AddButtonRow(new ButtonBase("#10 TreeView", new CallbackData("a", "treeview").Serialize()));
var sf = new SimpleForm();
btn.AddButtonRow(new ButtonBase("#11 ToggleButtons", new CallbackData("a", "togglebuttons").Serialize()));
await NavigateTo(sf);
btn.AddButtonRow(new ButtonBase("#11.2 MultiToggleButtons",
new CallbackData("a", "multitogglebuttons").Serialize()));
break;
btn.AddButtonRow(new ButtonBase("#12 ButtonGrid", new CallbackData("a", "buttongrid").Serialize()));
case "buttons":
btn.AddButtonRow(new ButtonBase("#13 ButtonGrid Paging & Filter",
new CallbackData("a", "buttongridfilter").Serialize()));
var bf = new ButtonTestForm();
btn.AddButtonRow(new ButtonBase("#14 ButtonGrid Tags (Filter)",
new CallbackData("a", "buttongridtags").Serialize()));
await NavigateTo(bf);
btn.AddButtonRow(new ButtonBase("#15 MultiView", new CallbackData("a", "multiview").Serialize()));
break;
btn.AddButtonRow(
new ButtonBase("#16 CheckedButtonList", new CallbackData("a", "checkedbuttonlist").Serialize()));
case "progress":
btn.AddButtonRow(new ButtonBase("#17 NavigationController (Push/Pop)",
new CallbackData("a", "navigationcontroller").Serialize()));
var pf = new ProgressTest();
await NavigateTo(pf);
break;
case "registration":
var reg = new Register.Start();
await NavigateTo(reg);
break;
case "form1":
var form1 = new TestForm();
await NavigateTo(form1);
break;
case "form2":
var form2 = new TestForm2();
await NavigateTo(form2);
break;
case "data":
var data = new DataForm();
await NavigateTo(data);
break;
case "calendar":
var calendar = new CalendarPickerForm();
await NavigateTo(calendar);
break;
case "month":
var month = new MonthPickerForm();
await NavigateTo(month);
break;
case "treeview":
var tree = new TreeViewForms();
await NavigateTo(tree);
break;
case "togglebuttons":
var tb = new ToggleButtons();
await NavigateTo(tb);
break;
case "multitogglebuttons":
var mtb = new MultiToggleButtons();
await NavigateTo(mtb);
break;
case "buttongrid":
var bg = new ButtonGridForm();
await NavigateTo(bg);
break;
case "buttongridfilter":
var bg2 = new ButtonGridPagingForm();
await NavigateTo(bg2);
break;
case "buttongridtags":
var bg3 = new ButtonGridTagForm();
await NavigateTo(bg3);
break;
case "multiview":
var mvf = new MultiViewForm();
await NavigateTo(mvf);
break;
case "checkedbuttonlist":
var cbl = new CheckedButtonListForm();
await NavigateTo(cbl);
break;
case "navigationcontroller":
var nc = new Navigation.Start();
await NavigateTo(nc);
break;
case "dynamicbuttongrid":
var dg = new List();
await NavigateTo(dg);
break;
case "notifications":
var not = new Notifications.Start();
await NavigateTo(not);
break;
default:
message.Handled = false;
break;
}
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("#1 Simple Text", new CallbackData("a", "text").Serialize()), new ButtonBase("#2 Button Test", new CallbackData("a", "buttons").Serialize()));
btn.AddButtonRow(new ButtonBase("#3 Progress Bar", new CallbackData("a", "progress").Serialize()));
btn.AddButtonRow(new ButtonBase("#4 Registration Example", new CallbackData("a", "registration").Serialize()));
btn.AddButtonRow(new ButtonBase("#5 Form1 Command", new CallbackData("a", "form1").Serialize()));
btn.AddButtonRow(new ButtonBase("#6 Form2 Command", new CallbackData("a", "form2").Serialize()));
btn.AddButtonRow(new ButtonBase("#7 Data Handling", new CallbackData("a", "data").Serialize()));
btn.AddButtonRow(new ButtonBase("#8 Calendar Picker", new CallbackData("a", "calendar").Serialize()));
btn.AddButtonRow(new ButtonBase("#9 Month Picker", new CallbackData("a", "month").Serialize()));
btn.AddButtonRow(new ButtonBase("#10 TreeView", new CallbackData("a", "treeview").Serialize()));
btn.AddButtonRow(new ButtonBase("#11 ToggleButtons", new CallbackData("a", "togglebuttons").Serialize()));
btn.AddButtonRow(new ButtonBase("#11.2 MultiToggleButtons", new CallbackData("a", "multitogglebuttons").Serialize()));
btn.AddButtonRow(new ButtonBase("#12 ButtonGrid", new CallbackData("a", "buttongrid").Serialize()));
btn.AddButtonRow(new ButtonBase("#13 ButtonGrid Paging & Filter", new CallbackData("a", "buttongridfilter").Serialize()));
btn.AddButtonRow(new ButtonBase("#14 ButtonGrid Tags (Filter)", new CallbackData("a", "buttongridtags").Serialize()));
btn.AddButtonRow(new ButtonBase("#15 MultiView", new CallbackData("a", "multiview").Serialize()));
btn.AddButtonRow(new ButtonBase("#16 CheckedButtonList", new CallbackData("a", "checkedbuttonlist").Serialize()));
btn.AddButtonRow(new ButtonBase("#17 NavigationController (Push/Pop)", new CallbackData("a", "navigationcontroller").Serialize()));
btn.AddButtonRow(new ButtonBase("#18 Dynamic ButtonGrid (DataSources)", new CallbackData("a", "dynamicbuttongrid").Serialize()));
btn.AddButtonRow(new ButtonBase("#19 Notifications", new CallbackData("a", "notifications").Serialize()));
await Device.Send("Choose your test:", btn);
}
btn.AddButtonRow(new ButtonBase("#18 Dynamic ButtonGrid (DataSources)",
new CallbackData("a", "dynamicbuttongrid").Serialize()));
btn.AddButtonRow(new ButtonBase("#19 Notifications", new CallbackData("a", "notifications").Serialize()));
await Device.Send("Choose your test:", btn);
}
}

View File

@ -3,40 +3,37 @@ using System.Threading.Tasks;
using TelegramBotBase.Form;
using TelegramBotBase.Form.Navigation;
namespace TelegramBotBaseTest.Tests.Navigation
namespace TelegramBotBaseTest.Tests.Navigation;
internal class CustomController : NavigationController
{
internal class CustomController : NavigationController
public CustomController(FormBase form) : base(form)
{
public CustomController(FormBase form) : base(form)
{
}
public override Task PushAsync(FormBase form, params object[] args)
{
Console.WriteLine($"Pushes form (Count on stack {Index + 1})");
//Device.Send($"Pushes form (Count on stack {this.Index + 1})");
return base.PushAsync(form, args);
}
public override Task PopAsync()
{
Console.WriteLine($"Pops one form (Count on stack {Index + 1})");
//Device.Send($"Pops one form (Count on stack {this.Index + 1})");
return base.PopAsync();
}
public override Task PopToRootAsync()
{
Console.WriteLine($"Moved back to root (Count on stack {Index + 1})");
//Device.Send($"Moved back to root (Count on stack {this.Index + 1})");
return base.PopToRootAsync();
}
}
}
public override Task PushAsync(FormBase form, params object[] args)
{
Console.WriteLine($"Pushes form (Count on stack {Index + 1})");
//Device.Send($"Pushes form (Count on stack {this.Index + 1})");
return base.PushAsync(form, args);
}
public override Task PopAsync()
{
Console.WriteLine($"Pops one form (Count on stack {Index + 1})");
//Device.Send($"Pops one form (Count on stack {this.Index + 1})");
return base.PopAsync();
}
public override Task PopToRootAsync()
{
Console.WriteLine($"Moved back to root (Count on stack {Index + 1})");
//Device.Send($"Moved back to root (Count on stack {this.Index + 1})");
return base.PopToRootAsync();
}
}

View File

@ -4,83 +4,80 @@ using Telegram.Bot.Types;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Navigation
namespace TelegramBotBaseTest.Tests.Navigation;
public class Form1 : FormBase
{
public class Form1 : FormBase
private Message _msg;
public Form1()
{
private Message _msg;
public Form1()
{
Closed += Form1_Closed;
}
private async Task Form1_Closed(object sender, EventArgs e)
{
if (_msg == null)
return;
await Device.DeleteMessage(_msg);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
await message.ConfirmAction();
switch (message.RawData)
{
case "next":
message.Handled = true;
var f1 = new Form1();
await NavigationController.PushAsync(f1);
break;
case "previous":
message.Handled = true;
//Pop's the current form and move the previous one. The root form will be the Start class.
await NavigationController.PopAsync();
break;
case "root":
message.Handled = true;
await NavigationController.PopToRootAsync();
break;
}
}
public override async Task Render(MessageResult message)
{
if (_msg != null)
return;
var bf = new ButtonForm();
bf.AddButtonRow("Next page", "next");
bf.AddButtonRow("Previous page", "previous");
bf.AddButtonRow("Back to root", "root");
_msg = await Device.Send($"Choose your options (Count on stack {NavigationController.Index + 1})", bf);
}
Closed += Form1_Closed;
}
}
private async Task Form1_Closed(object sender, EventArgs e)
{
if (_msg == null)
{
return;
}
await Device.DeleteMessage(_msg);
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
await message.ConfirmAction();
switch (message.RawData)
{
case "next":
message.Handled = true;
var f1 = new Form1();
await NavigationController.PushAsync(f1);
break;
case "previous":
message.Handled = true;
//Pop's the current form and move the previous one. The root form will be the Start class.
await NavigationController.PopAsync();
break;
case "root":
message.Handled = true;
await NavigationController.PopToRootAsync();
break;
}
}
public override async Task Render(MessageResult message)
{
if (_msg != null)
{
return;
}
var bf = new ButtonForm();
bf.AddButtonRow("Next page", "next");
bf.AddButtonRow("Previous page", "previous");
bf.AddButtonRow("Back to root", "root");
_msg = await Device.Send($"Choose your options (Count on stack {NavigationController.Index + 1})", bf);
}
}

View File

@ -3,77 +3,78 @@ using Telegram.Bot.Types;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Navigation
namespace TelegramBotBaseTest.Tests.Navigation;
public class Start : FormBase
{
public class Start : FormBase
private Message _msg;
public override Task Load(MessageResult message)
{
private Message _msg;
public override Task Load(MessageResult message)
{
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
await message.ConfirmAction();
switch (message.RawData)
{
case "yes":
message.Handled = true;
//Create navigation controller and navigate to it, keep the current form as root form so we can get back to here later
var nc = new CustomController(this);
nc.ForceCleanupOnLastPop = true;
var f1 = new Form1();
await nc.PushAsync(f1);
await NavigateTo(nc);
if (_msg == null)
return;
await Device.DeleteMessage(_msg);
break;
case "no":
message.Handled = true;
var mn = new Menu();
await NavigateTo(mn);
if (_msg == null)
return;
await Device.DeleteMessage(_msg);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Yes", "yes");
bf.AddButtonRow("No", "no");
_msg = await Device.Send("Open controller?", bf);
}
return Task.CompletedTask;
}
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
await message.ConfirmAction();
switch (message.RawData)
{
case "yes":
message.Handled = true;
//Create navigation controller and navigate to it, keep the current form as root form so we can get back to here later
var nc = new CustomController(this);
nc.ForceCleanupOnLastPop = true;
var f1 = new Form1();
await nc.PushAsync(f1);
await NavigateTo(nc);
if (_msg == null)
{
return;
}
await Device.DeleteMessage(_msg);
break;
case "no":
message.Handled = true;
var mn = new Menu();
await NavigateTo(mn);
if (_msg == null)
{
return;
}
await Device.DeleteMessage(_msg);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Yes", "yes");
bf.AddButtonRow("No", "no");
_msg = await Device.Send("Open controller?", bf);
}
}

View File

@ -3,59 +3,59 @@ using TelegramBotBase.Base;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Notifications
namespace TelegramBotBaseTest.Tests.Notifications;
public class Start : AutoCleanForm
{
public class Start : AutoCleanForm
private bool _sent;
public Start()
{
private bool _sent;
public Start()
{
DeleteMode = EDeleteMode.OnLeavingForm;
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
return;
switch (message.RawData)
{
case "alert":
await message.ConfirmAction("This is an alert.", true);
break;
case "back":
var mn = new Menu();
await NavigateTo(mn);
break;
default:
await message.ConfirmAction("This is feedback");
break;
}
}
public override async Task Render(MessageResult message)
{
if (_sent)
return;
var bf = new ButtonForm();
bf.AddButtonRow("Normal feeback", "normal");
bf.AddButtonRow("Alert Box", "alert");
bf.AddButtonRow("Back", "back");
await Device.Send("Choose your test", bf);
_sent = true;
}
DeleteMode = EDeleteMode.OnLeavingForm;
}
}
public override async Task Action(MessageResult message)
{
if (message.Handled)
{
return;
}
switch (message.RawData)
{
case "alert":
await message.ConfirmAction("This is an alert.", true);
break;
case "back":
var mn = new Menu();
await NavigateTo(mn);
break;
default:
await message.ConfirmAction("This is feedback");
break;
}
}
public override async Task Render(MessageResult message)
{
if (_sent)
{
return;
}
var bf = new ButtonForm();
bf.AddButtonRow("Normal feeback", "normal");
bf.AddButtonRow("Alert Box", "alert");
bf.AddButtonRow("Back", "back");
await Device.Send("Choose your test", bf);
_sent = true;
}
}

View File

@ -6,133 +6,131 @@ using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class ProgressTest : AutoCleanForm
{
public class ProgressTest : AutoCleanForm
public ProgressTest()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Opened += ProgressTest_Opened;
Closed += ProgressTest_Closed;
}
public ProgressTest()
private async Task ProgressTest_Opened(object sender, EventArgs e)
{
await Device.Send("Welcome to ProgressTest");
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
{
DeleteMode = EDeleteMode.OnLeavingForm;
Opened += ProgressTest_Opened;
Closed += ProgressTest_Closed;
return;
}
ProgressBar bar = null;
private async Task ProgressTest_Opened(object sender, EventArgs e)
switch (call.Value)
{
await Device.Send("Welcome to ProgressTest");
}
case "standard":
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.standard)
{
Device = Device
};
await message.ConfirmAction();
break;
case "squares":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.squares)
{
Device = Device
};
break;
case "circles":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.circles)
{
Device = Device
};
break;
case "lines":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.lines)
{
Device = Device
};
break;
case "squaredlines":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.squaredLines)
{
Device = Device
};
break;
case "start":
var sf = new Menu();
await NavigateTo(sf);
if (call == null)
return;
ProgressBar bar = null;
default:
switch (call.Value)
{
case "standard":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.standard)
{
Device = Device
};
break;
case "squares":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.squares)
{
Device = Device
};
break;
case "circles":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.circles)
{
Device = Device
};
break;
case "lines":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.lines)
{
Device = Device
};
break;
case "squaredlines":
bar = new ProgressBar(0, 100, ProgressBar.EProgressStyle.squaredLines)
{
Device = Device
};
break;
case "start":
var sf = new Menu();
await NavigateTo(sf);
return;
default:
return;
}
return;
}
//Render Progress bar and show some "example" progress
//Render Progress bar and show some "example" progress
await bar.Render(message);
Controls.Add(bar);
for (var i = 0; i <= 100; i++)
{
bar.Value++;
await bar.Render(message);
Controls.Add(bar);
for (var i = 0; i <= 100; i++)
{
bar.Value++;
await bar.Render(message);
Thread.Sleep(250);
}
Thread.Sleep(250);
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("Standard", new CallbackData("a", "standard").Serialize()), new ButtonBase("Squares", new CallbackData("a", "squares").Serialize()));
btn.AddButtonRow(new ButtonBase("Circles", new CallbackData("a", "circles").Serialize()), new ButtonBase("Lines", new CallbackData("a", "lines").Serialize()));
btn.AddButtonRow(new ButtonBase("Squared Line", new CallbackData("a", "squaredlines").Serialize()));
btn.AddButtonRow(new ButtonBase("Back to start", new CallbackData("a", "start").Serialize()));
await Device.Send("Choose your progress bar:", btn);
}
private async Task ProgressTest_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from ProgressTest");
}
}
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("Standard", new CallbackData("a", "standard").Serialize()),
new ButtonBase("Squares", new CallbackData("a", "squares").Serialize()));
btn.AddButtonRow(new ButtonBase("Circles", new CallbackData("a", "circles").Serialize()),
new ButtonBase("Lines", new CallbackData("a", "lines").Serialize()));
btn.AddButtonRow(new ButtonBase("Squared Line", new CallbackData("a", "squaredlines").Serialize()));
btn.AddButtonRow(new ButtonBase("Back to start", new CallbackData("a", "start").Serialize()));
await Device.Send("Choose your progress bar:", btn);
}
private async Task ProgressTest_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from ProgressTest");
}
}

View File

@ -2,99 +2,97 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Register
namespace TelegramBotBaseTest.Tests.Register;
public class PerForm : AutoCleanForm
{
public class PerForm : AutoCleanForm
public string EMail { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public override Task Load(MessageResult message)
{
public string EMail { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
public override Task Load(MessageResult message)
if (message.MessageText.Trim() == "")
{
if (message.MessageText.Trim() == "")
return Task.CompletedTask;
if (Firstname == null)
{
Firstname = message.MessageText;
return Task.CompletedTask;
}
if (Lastname == null)
{
Lastname = message.MessageText;
return Task.CompletedTask;
}
if (EMail == null)
{
EMail = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
if (Firstname == null)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
return;
switch (call.Value)
{
case "back":
var start = new Start();
await NavigateTo(start);
break;
}
Firstname = message.MessageText;
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
if (Lastname == null)
{
if (Firstname == null)
{
await Device.Send("Please sent your firstname:");
return;
}
if (Lastname == null)
{
await Device.Send("Please sent your lastname:");
return;
}
if (EMail == null)
{
await Device.Send("Please sent your email address:");
return;
}
var s = "";
s += "Firstname: " + Firstname + "\r\n";
s += "Lastname: " + Lastname + "\r\n";
s += "E-Mail: " + EMail + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "back").Serialize()));
await Device.Send("Your details:\r\n" + s, bf);
Lastname = message.MessageText;
return Task.CompletedTask;
}
if (EMail == null)
{
EMail = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
{
return;
}
switch (call.Value)
{
case "back":
var start = new Start();
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
if (Firstname == null)
{
await Device.Send("Please sent your firstname:");
return;
}
if (Lastname == null)
{
await Device.Send("Please sent your lastname:");
return;
}
if (EMail == null)
{
await Device.Send("Please sent your email address:");
return;
}
var s = "";
s += "Firstname: " + Firstname + "\r\n";
s += "Lastname: " + Lastname + "\r\n";
s += "E-Mail: " + EMail + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "back").Serialize()));
await Device.Send("Your details:\r\n" + s, bf);
}
}

View File

@ -3,42 +3,39 @@ using TelegramBotBase.Base;
using TelegramBotBase.Form;
using TelegramBotBaseTest.Tests.Register.Steps;
namespace TelegramBotBaseTest.Tests.Register
namespace TelegramBotBaseTest.Tests.Register;
public class PerStep : AutoCleanForm
{
public class PerStep: AutoCleanForm
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
public override async Task Action(MessageResult message)
switch (message.RawData)
{
await message.ConfirmAction();
case "start":
switch (message.RawData)
{
case "start":
var step1 = new Step1();
var step1 = new Step1();
await NavigateTo(step1);
await NavigateTo(step1);
break;
case "back":
break;
case "back":
var start = new Start();
var start = new Start();
await NavigateTo(start);
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Goto Step 1", "start"));
bf.AddButtonRow(new ButtonBase("Back", "back"));
await Device.Send("Register Steps", bf);
break;
}
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Goto Step 1", "start"));
bf.AddButtonRow(new ButtonBase("Back", "back"));
await Device.Send("Register Steps", bf);
}
}

View File

@ -2,62 +2,56 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Register
namespace TelegramBotBaseTest.Tests.Register;
public class Start : AutoCleanForm
{
public class Start : AutoCleanForm
public override async Task Action(MessageResult message)
{
public override async Task Action(MessageResult message)
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
if (call == null)
return;
switch (call.Value)
{
case "form":
var form = new PerForm();
await NavigateTo(form);
break;
case "step":
var step = new PerStep();
await NavigateTo(step);
break;
case "backtodashboard":
var start = new Menu();
await NavigateTo(start);
break;
}
return;
}
public override async Task Render(MessageResult message)
switch (call.Value)
{
case "form":
var btn = new ButtonForm();
var form = new PerForm();
btn.AddButtonRow(new ButtonBase("#4.1 Per Form", new CallbackData("a", "form").Serialize()));
btn.AddButtonRow(new ButtonBase("#4.2 Per Step", new CallbackData("a", "step").Serialize()));
btn.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "backtodashboard").Serialize()));
await NavigateTo(form);
await Device.Send("Choose your test:", btn);
break;
case "step":
var step = new PerStep();
await NavigateTo(step);
break;
case "backtodashboard":
var start = new Menu();
await NavigateTo(start);
break;
}
}
}
public override async Task Render(MessageResult message)
{
var btn = new ButtonForm();
btn.AddButtonRow(new ButtonBase("#4.1 Per Form", new CallbackData("a", "form").Serialize()));
btn.AddButtonRow(new ButtonBase("#4.2 Per Step", new CallbackData("a", "step").Serialize()));
btn.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "backtodashboard").Serialize()));
await Device.Send("Choose your test:", btn);
}
}

View File

@ -1,12 +1,10 @@
namespace TelegramBotBaseTest.Tests.Register.Steps
namespace TelegramBotBaseTest.Tests.Register.Steps;
public class Data
{
public class Data
{
public string EMail { get; set; }
public string EMail { get; set; }
public string Firstname { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
}
public string Lastname { get; set; }
}

View File

@ -3,57 +3,59 @@ using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Register.Steps
namespace TelegramBotBaseTest.Tests.Register.Steps;
public class Step1 : AutoCleanForm
{
public class Step1 : AutoCleanForm
public Step1()
{
public Data UserData { get; set; }
public Step1()
{
Init += Step1_Init;
}
private Task Step1_Init(object sender, InitEventArgs e)
{
UserData = new Data();
return Task.CompletedTask;
}
public override Task Load(MessageResult message)
{
if (message.Handled)
return Task.CompletedTask;
if (message.MessageText.Trim() == "")
return Task.CompletedTask;
if (UserData.Firstname == null)
{
UserData.Firstname = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
{
if (UserData.Firstname == null)
{
await Device.Send("Please sent your firstname:");
return;
}
message.Handled = true;
var step2 = new Step2();
step2.UserData = UserData;
await NavigateTo(step2);
}
Init += Step1_Init;
}
}
public Data UserData { get; set; }
private Task Step1_Init(object sender, InitEventArgs e)
{
UserData = new Data();
return Task.CompletedTask;
}
public override Task Load(MessageResult message)
{
if (message.Handled)
{
return Task.CompletedTask;
}
if (message.MessageText.Trim() == "")
{
return Task.CompletedTask;
}
if (UserData.Firstname == null)
{
UserData.Firstname = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
{
if (UserData.Firstname == null)
{
await Device.Send("Please sent your firstname:");
return;
}
message.Handled = true;
var step2 = new Step2();
step2.UserData = UserData;
await NavigateTo(step2);
}
}

View File

@ -2,47 +2,49 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Register.Steps
namespace TelegramBotBaseTest.Tests.Register.Steps;
public class Step2 : AutoCleanForm
{
public class Step2 : AutoCleanForm
public Data UserData { get; set; }
public override Task Load(MessageResult message)
{
public Data UserData { get; set; }
public override Task Load(MessageResult message)
if (message.Handled)
{
if (message.Handled)
return Task.CompletedTask;
if (message.MessageText.Trim() == "")
return Task.CompletedTask;
if (UserData.Lastname == null)
{
UserData.Lastname = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
if (message.MessageText.Trim() == "")
{
if (UserData.Lastname == null)
{
await Device.Send("Please sent your lastname:");
return;
}
message.Handled = true;
var step3 = new Step3();
step3.UserData = UserData;
await NavigateTo(step3);
return Task.CompletedTask;
}
if (UserData.Lastname == null)
{
UserData.Lastname = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
public override async Task Render(MessageResult message)
{
if (UserData.Lastname == null)
{
await Device.Send("Please sent your lastname:");
return;
}
message.Handled = true;
var step3 = new Step3();
step3.UserData = UserData;
await NavigateTo(step3);
}
}

View File

@ -2,68 +2,68 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests.Register.Steps
namespace TelegramBotBaseTest.Tests.Register.Steps;
public class Step3 : AutoCleanForm
{
public class Step3 : AutoCleanForm
public Data UserData { get; set; }
public override Task Load(MessageResult message)
{
public Data UserData { get; set; }
public override Task Load(MessageResult message)
if (message.Handled)
{
if (message.Handled)
return Task.CompletedTask;
if (message.MessageText.Trim() == "")
return Task.CompletedTask;
if (UserData.EMail == null)
{
UserData.EMail = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
if (message.MessageText.Trim() == "")
{
await message.ConfirmAction();
switch (message.RawData)
{
case "back":
var start = new Start();
await NavigateTo(start);
break;
}
return Task.CompletedTask;
}
public override async Task Render(MessageResult message)
if (UserData.EMail == null)
{
if (UserData.EMail == null)
{
await Device.Send("Please sent your email:");
return;
}
message.Handled = true;
var s = "";
s += "Firstname: " + UserData.Firstname + "\r\n";
s += "Lastname: " + UserData.Lastname + "\r\n";
s += "E-Mail: " + UserData.EMail + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
await Device.Send("Your details:\r\n" + s, bf);
UserData.EMail = message.MessageText;
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
switch (message.RawData)
{
case "back":
var start = new Start();
await NavigateTo(start);
break;
}
}
public override async Task Render(MessageResult message)
{
if (UserData.EMail == null)
{
await Device.Send("Please sent your email:");
return;
}
message.Handled = true;
var s = "";
s += "Firstname: " + UserData.Firstname + "\r\n";
s += "Lastname: " + UserData.Lastname + "\r\n";
s += "E-Mail: " + UserData.EMail + "\r\n";
var bf = new ButtonForm();
bf.AddButtonRow(new ButtonBase("Back", "back"));
await Device.Send("Your details:\r\n" + s, bf);
}
}

View File

@ -4,63 +4,59 @@ using TelegramBotBase.Base;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class SimpleForm : AutoCleanForm
{
public class SimpleForm : AutoCleanForm
public SimpleForm()
{
DeleteSide = EDeleteSide.Both;
DeleteMode = EDeleteMode.OnLeavingForm;
public SimpleForm()
{
DeleteSide = EDeleteSide.Both;
DeleteMode = EDeleteMode.OnLeavingForm;
Opened += SimpleForm_Opened;
}
private async Task SimpleForm_Opened(object sender, EventArgs e)
{
await Device.Send("Hello world! (send 'back' to get back to Start)\r\nOr\r\nhi, hello, maybe, bye and ciao");
}
public override async Task Load(MessageResult message)
{
//message.MessageText will work also, cause it is a string you could manage a lot different scenerios here
var messageId = message.MessageId;
switch (message.Command)
{
case "hello":
case "hi":
//Send him a simple message
await Device.Send("Hello you there !");
break;
case "maybe":
//Send him a simple message and reply to the one of himself
await Device.Send("Maybe what?", replyTo: messageId);
break;
case "bye":
case "ciao":
//Send him a simple message
await Device.Send("Ok, take care !");
break;
case "back":
var st = new Menu();
await NavigateTo(st);
break;
}
}
Opened += SimpleForm_Opened;
}
}
private async Task SimpleForm_Opened(object sender, EventArgs e)
{
await Device.Send("Hello world! (send 'back' to get back to Start)\r\nOr\r\nhi, hello, maybe, bye and ciao");
}
public override async Task Load(MessageResult message)
{
//message.MessageText will work also, cause it is a string you could manage a lot different scenerios here
var messageId = message.MessageId;
switch (message.Command)
{
case "hello":
case "hi":
//Send him a simple message
await Device.Send("Hello you there !");
break;
case "maybe":
//Send him a simple message and reply to the one of himself
await Device.Send("Maybe what?", replyTo: messageId);
break;
case "bye":
case "ciao":
//Send him a simple message
await Device.Send("Ok, take care !");
break;
case "back":
var st = new Menu();
await NavigateTo(st);
break;
}
}
}

View File

@ -3,36 +3,34 @@ using TelegramBotBase.Base;
using TelegramBotBase.Form;
using TelegramBotBaseTest.Tests.Groups;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class Start : SplitterForm
{
public class Start : SplitterForm
public override async Task<bool> Open(MessageResult e)
{
public override async Task<bool> Open(MessageResult e)
{
var st = new Menu();
await NavigateTo(st);
return true;
}
public override async Task<bool> OpenGroup(MessageResult e)
{
var st = new LinkReplaceTest();
await NavigateTo(st);
return true;
}
public override Task<bool> OpenChannel(MessageResult e)
{
return base.OpenChannel(e);
}
public override Task<bool> OpenSupergroup(MessageResult e)
{
return base.OpenSupergroup(e);
}
var st = new Menu();
await NavigateTo(st);
return true;
}
}
public override async Task<bool> OpenGroup(MessageResult e)
{
var st = new LinkReplaceTest();
await NavigateTo(st);
return true;
}
public override Task<bool> OpenChannel(MessageResult e)
{
return base.OpenChannel(e);
}
public override Task<bool> OpenSupergroup(MessageResult e)
{
return base.OpenSupergroup(e);
}
}

View File

@ -3,70 +3,65 @@ using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class TestForm : FormBase
{
public class TestForm : FormBase
public TestForm()
{
private string LastMessage { get; set; }
public TestForm()
{
Opened += TestForm_Opened;
Closed += TestForm_Closed;
}
private async Task TestForm_Opened(object sender, EventArgs e)
{
await Device.Send("Welcome to Form 1");
}
private async Task TestForm_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from Form 1");
}
public override async Task Action(MessageResult message)
{
switch (message.Command)
{
case "reply":
break;
case "navigate":
var tf = new TestForm2();
await NavigateTo(tf);
break;
default:
if (message.UpdateData == null)
return;
LastMessage = message.Message.Text;
break;
}
}
public override async Task Render(MessageResult message)
{
if (message.Command == "reply")
{
await Device.Send("Last message: " + LastMessage);
}
}
Opened += TestForm_Opened;
Closed += TestForm_Closed;
}
}
private string LastMessage { get; set; }
private async Task TestForm_Opened(object sender, EventArgs e)
{
await Device.Send("Welcome to Form 1");
}
private async Task TestForm_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from Form 1");
}
public override async Task Action(MessageResult message)
{
switch (message.Command)
{
case "reply":
break;
case "navigate":
var tf = new TestForm2();
await NavigateTo(tf);
break;
default:
if (message.UpdateData == null)
{
return;
}
LastMessage = message.Message.Text;
break;
}
}
public override async Task Render(MessageResult message)
{
if (message.Command == "reply")
{
await Device.Send("Last message: " + LastMessage);
}
}
}

View File

@ -6,118 +6,103 @@ using TelegramBotBase.Base;
using TelegramBotBase.Extensions.Images;
using TelegramBotBase.Form;
namespace TelegramBotBaseTest.Tests
namespace TelegramBotBaseTest.Tests;
public class TestForm2 : FormBase
{
public class TestForm2 : FormBase
public TestForm2()
{
public TestForm2()
{
Opened += TestForm2_Opened;
Closed += TestForm2_Closed;
}
private async Task TestForm2_Opened(object sender, EventArgs e)
{
await Device.Send("Welcome to Form 2");
}
private async Task TestForm2_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from Form 2");
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
await message.DeleteMessage();
message.Handled = true;
if (call.Value == "testform1")
{
var tf = new TestForm();
await NavigateTo(tf);
}
else if (call.Value == "alert")
{
var ad = new AlertDialog("This is a message", "Ok");
ad.ButtonClicked += async (s, en) =>
{
var fto = new TestForm2();
await NavigateTo(fto);
};
await NavigateTo(ad);
}
else if (call.Value == "confirm")
{
var pd = new ConfirmDialog("Please confirm", new ButtonBase("Ok", "ok"), new ButtonBase("Cancel", "cancel"));
pd.ButtonClicked += async (s, en) =>
{
var tf = new TestForm2();
await pd.NavigateTo(tf);
};
await NavigateTo(pd);
}
else if (call.Value == "prompt")
{
var pd = new PromptDialog("Please tell me your name ?");
pd.Completed += async (s, en) =>
{
await Device.Send("Hello " + pd.Value);
};
await OpenModal(pd);
}
}
public override async Task Render(MessageResult message)
{
var bmp = new Bitmap(800, 600);
using (var g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
g.DrawString("Test Image", new Font("Arial", 24, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Black, new PointF(50, 50));
}
await Device.SetAction(ChatAction.UploadPhoto);
var btn = new ButtonForm();
//btn.AddButtonRow(new ButtonBase("Zum Testformular 1", CallbackData.Create("navigate", "testform1")), new ButtonBase("Zum Testformular 1", CallbackData.Create("navigate", "testform1")));
btn.AddButtonRow(new ButtonBase("Information Prompt", CallbackData.Create("navigate", "alert")));
btn.AddButtonRow(new ButtonBase("Confirmation Prompt with event", CallbackData.Create("navigate", "confirm")));
btn.AddButtonRow(new ButtonBase("Request Prompt", CallbackData.Create("navigate", "prompt")));
await Device.SendPhoto(bmp, "Test", "", btn);
}
Opened += TestForm2_Opened;
Closed += TestForm2_Closed;
}
}
private async Task TestForm2_Opened(object sender, EventArgs e)
{
await Device.Send("Welcome to Form 2");
}
private async Task TestForm2_Closed(object sender, EventArgs e)
{
await Device.Send("Ciao from Form 2");
}
public override async Task Action(MessageResult message)
{
var call = message.GetData<CallbackData>();
await message.ConfirmAction();
await message.DeleteMessage();
message.Handled = true;
if (call.Value == "testform1")
{
var tf = new TestForm();
await NavigateTo(tf);
}
else if (call.Value == "alert")
{
var ad = new AlertDialog("This is a message", "Ok");
ad.ButtonClicked += async (s, en) =>
{
var fto = new TestForm2();
await NavigateTo(fto);
};
await NavigateTo(ad);
}
else if (call.Value == "confirm")
{
var pd = new ConfirmDialog("Please confirm", new ButtonBase("Ok", "ok"),
new ButtonBase("Cancel", "cancel"));
pd.ButtonClicked += async (s, en) =>
{
var tf = new TestForm2();
await pd.NavigateTo(tf);
};
await NavigateTo(pd);
}
else if (call.Value == "prompt")
{
var pd = new PromptDialog("Please tell me your name ?");
pd.Completed += async (s, en) => { await Device.Send("Hello " + pd.Value); };
await OpenModal(pd);
}
}
public override async Task Render(MessageResult message)
{
var bmp = new Bitmap(800, 600);
using (var g = Graphics.FromImage(bmp))
{
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
g.DrawString("Test Image", new Font("Arial", 24, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Black,
new PointF(50, 50));
}
await Device.SetAction(ChatAction.UploadPhoto);
var btn = new ButtonForm();
//btn.AddButtonRow(new ButtonBase("Zum Testformular 1", CallbackData.Create("navigate", "testform1")), new ButtonBase("Zum Testformular 1", CallbackData.Create("navigate", "testform1")));
btn.AddButtonRow(new ButtonBase("Information Prompt", CallbackData.Create("navigate", "alert")));
btn.AddButtonRow(new ButtonBase("Confirmation Prompt with event", CallbackData.Create("navigate", "confirm")));
btn.AddButtonRow(new ButtonBase("Request Prompt", CallbackData.Create("navigate", "prompt")));
await Device.SendPhoto(bmp, "Test", "", btn);
}
}

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net5" />
<package id="System.Net.Requests" version="4.3.0" targetFramework="net5" />
<package id="Telegram.Bot" version="14.12.0" targetFramework="net5" />
</packages>
<package id="Newtonsoft.Json" version="12.0.2" targetFramework="net5"/>
<package id="System.Net.Requests" version="4.3.0" targetFramework="net5"/>
<package id="Telegram.Bot" version="14.12.0" targetFramework="net5"/>
</packages>

View File

@ -3,40 +3,36 @@ using System.Collections.Generic;
using Telegram.Bot.Types;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
/// <summary>
/// Base class for given bot command results
/// </summary>
public class BotCommandEventArgs : EventArgs
{
/// <summary>
/// Base class for given bot command results
/// </summary>
public class BotCommandEventArgs : EventArgs
public BotCommandEventArgs()
{
public string Command { get; set; }
public List<string> Parameters { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public bool Handled { get; set; } = false;
public Message OriginalMessage { get; set; }
public BotCommandEventArgs()
{
}
public BotCommandEventArgs(string command, List<string> parameters, Message message, long deviceId, DeviceSession device)
{
this.Command = command;
this.Parameters = parameters;
OriginalMessage = message;
this.DeviceId = deviceId;
this.Device = device;
}
}
}
public BotCommandEventArgs(string command, List<string> parameters, Message message, long deviceId,
DeviceSession device)
{
Command = command;
Parameters = parameters;
OriginalMessage = message;
DeviceId = deviceId;
Device = device;
}
public string Command { get; set; }
public List<string> Parameters { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public bool Handled { get; set; } = false;
public Message OriginalMessage { get; set; }
}

View File

@ -2,44 +2,41 @@
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Form;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
/// <summary>
/// Button get clicked event
/// </summary>
public class ButtonClickedEventArgs : EventArgs
{
/// <summary>
/// Button get clicked event
/// </summary>
public class ButtonClickedEventArgs : EventArgs
public ButtonClickedEventArgs()
{
public ButtonBase Button { get; set; }
public int Index { get; set; }
public object Tag { get; set; }
public ButtonRow Row { get; set; }
public ButtonClickedEventArgs()
{
}
public ButtonClickedEventArgs(ButtonBase button)
{
Button = button;
Index = -1;
}
public ButtonClickedEventArgs(ButtonBase button, int index)
{
Button = button;
this.Index = index;
}
public ButtonClickedEventArgs(ButtonBase button, int index, ButtonRow row)
{
Button = button;
this.Index = index;
Row = row;
}
}
}
public ButtonClickedEventArgs(ButtonBase button)
{
Button = button;
Index = -1;
}
public ButtonClickedEventArgs(ButtonBase button, int index)
{
Button = button;
Index = index;
}
public ButtonClickedEventArgs(ButtonBase button, int index, ButtonRow row)
{
Button = button;
Index = index;
Row = row;
}
public ButtonBase Button { get; set; }
public int Index { get; set; }
public object Tag { get; set; }
public ButtonRow Row { get; set; }
}

View File

@ -1,41 +1,36 @@
using System;
using TelegramBotBase.Controls.Hybrid;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class CheckedChangedEventArgs : EventArgs
{
public class CheckedChangedEventArgs : EventArgs
public CheckedChangedEventArgs()
{
/// <summary>
/// Contains the index of the row where the button is inside.
/// Contains -1 when it is a layout button or not found.
/// </summary>
public int Index { get; set; }
/// <summary>
/// Contains all buttons within this row, excluding the checkbox.
/// </summary>
public ButtonRow Row { get; set; }
/// <summary>
/// Contains the new checked status of the row.
/// </summary>
public bool Checked { get; set; }
public CheckedChangedEventArgs()
{
}
public CheckedChangedEventArgs(ButtonRow row, int index, bool @checked)
{
Row = row;
this.Index = index;
this.Checked = @checked;
}
}
}
public CheckedChangedEventArgs(ButtonRow row, int index, bool @checked)
{
Row = row;
Index = index;
Checked = @checked;
}
/// <summary>
/// Contains the index of the row where the button is inside.
/// Contains -1 when it is a layout button or not found.
/// </summary>
public int Index { get; set; }
/// <summary>
/// Contains all buttons within this row, excluding the checkbox.
/// </summary>
public ButtonRow Row { get; set; }
/// <summary>
/// Contains the new checked status of the row.
/// </summary>
public bool Checked { get; set; }
}

View File

@ -2,21 +2,17 @@
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Base;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class GroupChangedEventArgs : EventArgs
{
public class GroupChangedEventArgs : EventArgs
public GroupChangedEventArgs(MessageType type, MessageResult message)
{
public MessageType Type { get; set; }
public MessageResult OriginalMessage { get; set; }
public GroupChangedEventArgs(MessageType type, MessageResult message)
{
Type = type;
OriginalMessage = message;
}
Type = type;
OriginalMessage = message;
}
}
public MessageType Type { get; set; }
public MessageResult OriginalMessage { get; set; }
}

View File

@ -1,14 +1,13 @@
using System;
namespace TelegramBotBase.Args
{
public class InitEventArgs : EventArgs
{
public object[] Args { get; set; }
namespace TelegramBotBase.Args;
public InitEventArgs(params object[] args)
{
Args = args;
}
public class InitEventArgs : EventArgs
{
public InitEventArgs(params object[] args)
{
Args = args;
}
}
public object[] Args { get; set; }
}

View File

@ -1,55 +1,59 @@
using System.Collections.Generic;
using System.Linq;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class LoadStateEventArgs
{
public class LoadStateEventArgs
public LoadStateEventArgs()
{
public Dictionary<string,object> Values { get; set; }
public LoadStateEventArgs()
{
Values = new Dictionary<string, object>();
}
public List<string> Keys => Values.Keys.ToList();
public string Get(string key)
{
return Values[key].ToString();
}
public int GetInt(string key)
{
var i = 0;
if (int.TryParse(Values[key].ToString(), out i))
return i;
return 0;
}
public double GetDouble(string key)
{
double d = 0;
if (double.TryParse(Values[key].ToString(), out d))
return d;
return 0;
}
public bool GetBool(string key)
{
var b = false;
if (bool.TryParse(Values[key].ToString(), out b))
return b;
return false;
}
public object GetObject(string key)
{
return Values[key];
}
Values = new Dictionary<string, object>();
}
}
public Dictionary<string, object> Values { get; set; }
public List<string> Keys => Values.Keys.ToList();
public string Get(string key)
{
return Values[key].ToString();
}
public int GetInt(string key)
{
var i = 0;
if (int.TryParse(Values[key].ToString(), out i))
{
return i;
}
return 0;
}
public double GetDouble(string key)
{
double d = 0;
if (double.TryParse(Values[key].ToString(), out d))
{
return d;
}
return 0;
}
public bool GetBool(string key)
{
var b = false;
if (bool.TryParse(Values[key].ToString(), out b))
{
return b;
}
return false;
}
public object GetObject(string key)
{
return Values[key];
}
}

View File

@ -5,32 +5,25 @@ using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Base;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class MemberChangeEventArgs : EventArgs
{
public class MemberChangeEventArgs : EventArgs
public MemberChangeEventArgs()
{
public List<User> Members { get; set; }
public MessageType Type { get; set; }
public MessageResult Result { get; set; }
public MemberChangeEventArgs()
{
Members = new List<User>();
}
public MemberChangeEventArgs(MessageType type, MessageResult result, params User[] members)
{
Type = type;
Result = result;
Members = members.ToList();
}
Members = new List<User>();
}
}
public MemberChangeEventArgs(MessageType type, MessageResult result, params User[] members)
{
Type = type;
Result = result;
Members = members.ToList();
}
public List<User> Members { get; set; }
public MessageType Type { get; set; }
public MessageResult Result { get; set; }
}

View File

@ -1,16 +1,11 @@
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class MessageDeletedEventArgs
{
public class MessageDeletedEventArgs
public MessageDeletedEventArgs(int messageId)
{
public int MessageId
{
get;set;
}
public MessageDeletedEventArgs(int messageId)
{
MessageId = messageId;
}
MessageId = messageId;
}
}
public int MessageId { get; set; }
}

View File

@ -1,26 +1,20 @@
using System;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
public class MessageIncomeEventArgs : EventArgs
{
public class MessageIncomeEventArgs : EventArgs
public MessageIncomeEventArgs(long deviceId, DeviceSession device, MessageResult message)
{
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public MessageResult Message { get; set; }
public MessageIncomeEventArgs(long deviceId, DeviceSession device, MessageResult message)
{
this.DeviceId = deviceId;
this.Device = device;
Message = message;
}
DeviceId = deviceId;
Device = device;
Message = message;
}
}
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public MessageResult Message { get; set; }
}

View File

@ -1,17 +1,15 @@
using Telegram.Bot.Types;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class MessageReceivedEventArgs
{
public class MessageReceivedEventArgs
public MessageReceivedEventArgs(Message m)
{
public int MessageId => Message.MessageId;
public Message Message { get; set; }
public MessageReceivedEventArgs(Message m)
{
Message = m;
}
Message = m;
}
}
public int MessageId => Message.MessageId;
public Message Message { get; set; }
}

View File

@ -1,26 +1,22 @@
using System;
using Telegram.Bot.Types;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class MessageSentEventArgs : EventArgs
{
public class MessageSentEventArgs : EventArgs
public MessageSentEventArgs(Message message, Type origin)
{
public int MessageId => Message.MessageId;
public Message Message { get; set; }
/// <summary>
/// Contains the element, which has called the method.
/// </summary>
public Type Origin { get; set; }
public MessageSentEventArgs(Message message, Type origin)
{
Message = message;
this.Origin = origin;
}
Message = message;
Origin = origin;
}
}
public int MessageId => Message.MessageId;
public Message Message { get; set; }
/// <summary>
/// Contains the element, which has called the method.
/// </summary>
public Type Origin { get; set; }
}

View File

@ -1,10 +1,8 @@
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class PromptDialogCompletedEventArgs
{
public class PromptDialogCompletedEventArgs
{
public object Tag { get; set; }
public object Tag { get; set; }
public string Value { get; set; }
}
}
public string Value { get; set; }
}

View File

@ -1,18 +1,13 @@
using System;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class RenderViewEventArgs : EventArgs
{
public class RenderViewEventArgs : EventArgs
public RenderViewEventArgs(int viewIndex)
{
public int CurrentView { get; set; }
public RenderViewEventArgs(int viewIndex)
{
CurrentView = viewIndex;
}
CurrentView = viewIndex;
}
}
public int CurrentView { get; set; }
}

View File

@ -1,39 +1,38 @@
using System.Collections.Generic;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class SaveStateEventArgs
{
public class SaveStateEventArgs
public SaveStateEventArgs()
{
public Dictionary<string, object> Values { get; set; }
public SaveStateEventArgs()
{
Values = new Dictionary<string, object>();
}
public void Set(string key, string value)
{
Values[key] = value;
}
public void SetInt(string key, int value)
{
Values[key] = value;
}
public void SetBool(string key, bool value)
{
Values[key] = value;
}
public void SetDouble(string key, double value)
{
Values[key] = value;
}
public void SetObject(string key, object value)
{
Values[key] = value;
}
Values = new Dictionary<string, object>();
}
}
public Dictionary<string, object> Values { get; set; }
public void Set(string key, string value)
{
Values[key] = value;
}
public void SetInt(string key, int value)
{
Values[key] = value;
}
public void SetBool(string key, bool value)
{
Values[key] = value;
}
public void SetDouble(string key, double value)
{
Values[key] = value;
}
public void SetObject(string key, object value)
{
Values[key] = value;
}
}

View File

@ -1,15 +1,13 @@
using TelegramBotBase.Base;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class SaveStatesEventArgs
{
public class SaveStatesEventArgs
public SaveStatesEventArgs(StateContainer states)
{
public StateContainer States { get; set; }
public SaveStatesEventArgs(StateContainer states)
{
States = states;
}
States = states;
}
}
public StateContainer States { get; set; }
}

View File

@ -1,18 +1,17 @@
using System;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
public class SessionBeginEventArgs : EventArgs
{
public class SessionBeginEventArgs : EventArgs
public SessionBeginEventArgs(long deviceId, DeviceSession device)
{
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public SessionBeginEventArgs(long deviceId, DeviceSession device)
{
this.DeviceId = deviceId;
this.Device = device;
}
DeviceId = deviceId;
Device = device;
}
}
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
}

View File

@ -1,32 +1,27 @@
using System;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class SystemExceptionEventArgs : EventArgs
{
public class SystemExceptionEventArgs : EventArgs
public SystemExceptionEventArgs()
{
public string Command { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public Exception Error { get; set; }
public SystemExceptionEventArgs()
{
}
public SystemExceptionEventArgs(string command, long deviceId, DeviceSession device, Exception error)
{
this.Command = command;
this.DeviceId = deviceId;
this.Device = device;
Error = error;
}
}
}
public SystemExceptionEventArgs(string command, long deviceId, DeviceSession device, Exception error)
{
Command = command;
DeviceId = deviceId;
Device = device;
Error = error;
}
public string Command { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public Exception Error { get; set; }
}

View File

@ -2,40 +2,37 @@
using Telegram.Bot.Types;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Args
namespace TelegramBotBase.Args;
public class UnhandledCallEventArgs : EventArgs
{
public class UnhandledCallEventArgs : EventArgs
public UnhandledCallEventArgs()
{
public string Command { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device {get;set;}
public string RawData { get; set; }
public int MessageId { get; set; }
public Message Message { get; set; }
public bool Handled { get; set; }
public UnhandledCallEventArgs()
{
Handled = false;
}
public UnhandledCallEventArgs(string command,string rawData, long deviceId, int messageId, Message message, DeviceSession device) : this()
{
this.Command = command;
this.RawData = rawData;
this.DeviceId = deviceId;
this.MessageId = messageId;
Message = message;
this.Device = device;
}
Handled = false;
}
}
public UnhandledCallEventArgs(string command, string rawData, long deviceId, int messageId, Message message,
DeviceSession device) : this()
{
Command = command;
RawData = rawData;
DeviceId = deviceId;
MessageId = messageId;
Message = message;
Device = device;
}
public string Command { get; set; }
public long DeviceId { get; set; }
public DeviceSession Device { get; set; }
public string RawData { get; set; }
public int MessageId { get; set; }
public Message Message { get; set; }
public bool Handled { get; set; }
}

View File

@ -1,15 +1,11 @@
using System;
namespace TelegramBotBase.Attributes
namespace TelegramBotBase.Attributes;
/// <summary>
/// Declares that this class should not be getting serialized
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class IgnoreState : Attribute
{
/// <summary>
/// Declares that this class should not be getting serialized
/// </summary>
[AttributeUsage(AttributeTargets.Class)]
public class IgnoreState : Attribute
{
}
}
}

View File

@ -1,13 +1,11 @@
using System;
namespace TelegramBotBase.Attributes
{
/// <summary>
/// Declares that the field or property should be save and recovered an restart.
/// </summary>
public class SaveState : Attribute
{
public string Key { get; set; }
namespace TelegramBotBase.Attributes;
}
}
/// <summary>
/// Declares that the field or property should be save and recovered an restart.
/// </summary>
public class SaveState : Attribute
{
public string Key { get; set; }
}

View File

@ -3,22 +3,25 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace TelegramBotBase.Base
{
public static class Async
{
public delegate Task AsyncEventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;
namespace TelegramBotBase.Base;
public static IEnumerable<AsyncEventHandler<TEventArgs>> GetHandlers<TEventArgs>(
public static class Async
{
public delegate Task AsyncEventHandler<TEventArgs>(object sender, TEventArgs e) where TEventArgs : EventArgs;
public static IEnumerable<AsyncEventHandler<TEventArgs>> GetHandlers<TEventArgs>(
this AsyncEventHandler<TEventArgs> handler)
where TEventArgs : EventArgs
=> handler.GetInvocationList().Cast<AsyncEventHandler<TEventArgs>>();
public static Task InvokeAllAsync<TEventArgs>(this AsyncEventHandler<TEventArgs> handler, object sender, TEventArgs e)
where TEventArgs : EventArgs
=> Task.WhenAll(
handler.GetHandlers()
.Select(handleAsync => handleAsync(sender, e)));
{
return handler.GetInvocationList().Cast<AsyncEventHandler<TEventArgs>>();
}
}
public static Task InvokeAllAsync<TEventArgs>(this AsyncEventHandler<TEventArgs> handler, object sender,
TEventArgs e)
where TEventArgs : EventArgs
{
return Task.WhenAll(
handler.GetHandlers()
.Select(handleAsync => handleAsync(sender, e)));
}
}

View File

@ -1,63 +1,59 @@
using System.Threading.Tasks;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
/// <summary>
/// Base class for controls
/// </summary>
public class ControlBase
{
public DeviceSession Device { get; set; }
public int Id { get; set; }
public string ControlId => "#c" + Id;
/// <summary>
/// Base class for controls
/// Defines if the control should be rendered and invoked with actions
/// </summary>
public class ControlBase
public bool Enabled { get; set; } = true;
/// <summary>
/// Get invoked when control will be added to a form and invoked.
/// </summary>
/// <returns></returns>
public virtual void Init()
{
public DeviceSession Device { get; set; }
public int Id { get; set; }
public string ControlId => "#c" + Id;
/// <summary>
/// Defines if the control should be rendered and invoked with actions
/// </summary>
public bool Enabled { get; set; } = true;
/// <summary>
/// Get invoked when control will be added to a form and invoked.
/// </summary>
/// <returns></returns>
public virtual void Init()
{
}
public virtual Task Load(MessageResult result)
{
return Task.CompletedTask;
}
public virtual Task Action(MessageResult result, string value = null)
{
return Task.CompletedTask;
}
public virtual Task Render(MessageResult result)
{
return Task.CompletedTask;
}
public virtual Task Hidden(bool formClose)
{
return Task.CompletedTask;
}
/// <summary>
/// Will be called on a cleanup.
/// </summary>
/// <returns></returns>
public virtual Task Cleanup()
{
return Task.CompletedTask;
}
}
}
public virtual Task Load(MessageResult result)
{
return Task.CompletedTask;
}
public virtual Task Action(MessageResult result, string value = null)
{
return Task.CompletedTask;
}
public virtual Task Render(MessageResult result)
{
return Task.CompletedTask;
}
public virtual Task Hidden(bool formClose)
{
return Task.CompletedTask;
}
/// <summary>
/// Will be called on a cleanup.
/// </summary>
/// <returns></returns>
public virtual Task Cleanup()
{
return Task.CompletedTask;
}
}

View File

@ -7,166 +7,164 @@ using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.InputFiles;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
/// <summary>
/// Returns a class to manage attachments within messages.
/// </summary>
public class DataResult : ResultBase
{
/// <summary>
/// Returns a class to manage attachments within messages.
/// </summary>
public class DataResult : ResultBase
public DataResult(UpdateResult update)
{
//public Telegram.Bot.Args.MessageEventArgs RawMessageData { get; set; }
public UpdateResult UpdateData { get; set; }
public Contact Contact => Message.Contact;
public Location Location => Message.Location;
public Document Document => Message.Document;
public Audio Audio => Message.Audio;
public Video Video => Message.Video;
public PhotoSize[] Photos => Message.Photo;
public MessageType Type => Message?.Type ?? MessageType.Unknown;
public override Message Message => UpdateData?.Message;
/// <summary>
/// Returns the FileId of the first reachable element.
/// </summary>
public string FileId =>
(Document?.FileId ??
Audio?.FileId ??
Video?.FileId ??
Photos.FirstOrDefault()?.FileId);
public DataResult(UpdateResult update)
{
UpdateData = update;
}
public async Task<InputOnlineFile> DownloadDocument()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Document.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, Document.FileName);
}
/// <summary>
/// Downloads a file and saves it to the given path.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public async Task DownloadDocument(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Document.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
/// <summary>
/// Downloads the document and returns an byte array.
/// </summary>
/// <returns></returns>
public async Task<byte[]> DownloadRawDocument()
{
var ms = new MemoryStream();
await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId, ms);
return ms.ToArray();
}
/// <summary>
/// Downloads a document and returns it as string. (txt,csv,etc) Default encoding ist UTF8.
/// </summary>
/// <returns></returns>
public async Task<string> DownloadRawTextDocument()
{
return await DownloadRawTextDocument(Encoding.UTF8);
}
/// <summary>
/// Downloads a document and returns it as string. (txt,csv,etc)
/// </summary>
/// <returns></returns>
public async Task<string> DownloadRawTextDocument(Encoding encoding)
{
var ms = new MemoryStream();
await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId, ms);
ms.Position = 0;
var sr = new StreamReader(ms, encoding);
return sr.ReadToEnd();
}
public async Task<InputOnlineFile> DownloadVideo()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Video.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Video.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadVideo(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Video.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
public async Task<InputOnlineFile> DownloadAudio()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Audio.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Audio.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadAudio(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Audio.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
public async Task<InputOnlineFile> DownloadPhoto(int index)
{
var photo = Photos[index];
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(photo.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(photo.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadPhoto(int index, string path)
{
var photo = Photos[index];
var file = await Device.Client.TelegramClient.GetFileAsync(photo.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
UpdateData = update;
}
}
//public Telegram.Bot.Args.MessageEventArgs RawMessageData { get; set; }
public UpdateResult UpdateData { get; set; }
public Contact Contact => Message.Contact;
public Location Location => Message.Location;
public Document Document => Message.Document;
public Audio Audio => Message.Audio;
public Video Video => Message.Video;
public PhotoSize[] Photos => Message.Photo;
public MessageType Type => Message?.Type ?? MessageType.Unknown;
public override Message Message => UpdateData?.Message;
/// <summary>
/// Returns the FileId of the first reachable element.
/// </summary>
public string FileId =>
Document?.FileId ??
Audio?.FileId ??
Video?.FileId ??
Photos.FirstOrDefault()?.FileId;
public async Task<InputOnlineFile> DownloadDocument()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Document.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId,
encryptedContent);
return new InputOnlineFile(encryptedContent, Document.FileName);
}
/// <summary>
/// Downloads a file and saves it to the given path.
/// </summary>
/// <param name="path"></param>
/// <returns></returns>
public async Task DownloadDocument(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Document.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
/// <summary>
/// Downloads the document and returns an byte array.
/// </summary>
/// <returns></returns>
public async Task<byte[]> DownloadRawDocument()
{
var ms = new MemoryStream();
await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId, ms);
return ms.ToArray();
}
/// <summary>
/// Downloads a document and returns it as string. (txt,csv,etc) Default encoding ist UTF8.
/// </summary>
/// <returns></returns>
public async Task<string> DownloadRawTextDocument()
{
return await DownloadRawTextDocument(Encoding.UTF8);
}
/// <summary>
/// Downloads a document and returns it as string. (txt,csv,etc)
/// </summary>
/// <returns></returns>
public async Task<string> DownloadRawTextDocument(Encoding encoding)
{
var ms = new MemoryStream();
await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Document.FileId, ms);
ms.Position = 0;
var sr = new StreamReader(ms, encoding);
return sr.ReadToEnd();
}
public async Task<InputOnlineFile> DownloadVideo()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Video.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Video.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadVideo(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Video.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
public async Task<InputOnlineFile> DownloadAudio()
{
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(Audio.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(Audio.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadAudio(string path)
{
var file = await Device.Client.TelegramClient.GetFileAsync(Audio.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
public async Task<InputOnlineFile> DownloadPhoto(int index)
{
var photo = Photos[index];
var encryptedContent = new MemoryStream();
encryptedContent.SetLength(photo.FileSize.Value);
var file = await Device.Client.TelegramClient.GetInfoAndDownloadFileAsync(photo.FileId, encryptedContent);
return new InputOnlineFile(encryptedContent, "");
}
public async Task DownloadPhoto(int index, string path)
{
var photo = Photos[index];
var file = await Device.Client.TelegramClient.GetFileAsync(photo.FileId);
var fs = new FileStream(path, FileMode.Create);
await Device.Client.TelegramClient.DownloadFileAsync(file.FilePath, fs);
fs.Close();
fs.Dispose();
}
}

View File

@ -9,421 +9,442 @@ using TelegramBotBase.Form.Navigation;
using TelegramBotBase.Sessions;
using static TelegramBotBase.Base.Async;
namespace TelegramBotBase.Form
namespace TelegramBotBase.Form;
/// <summary>
/// Base class for forms
/// </summary>
public class FormBase : IDisposable
{
/// <summary>
/// Base class for forms
/// </summary>
public class FormBase : IDisposable
private static readonly object EvInit = new();
private static readonly object EvOpened = new();
private static readonly object EvClosed = new();
public EventHandlerList Events = new();
public FormBase()
{
Controls = new List<ControlBase>();
}
public NavigationController NavigationController { get; set; }
public FormBase(MessageClient client) : this()
{
Client = client;
}
public DeviceSession Device { get; set; }
public NavigationController NavigationController { get; set; }
public MessageClient Client { get; set; }
public DeviceSession Device { get; set; }
/// <summary>
/// has this formular already been disposed ?
/// </summary>
public bool IsDisposed { get; set; }
public MessageClient Client { get; set; }
public List<ControlBase> Controls { get; set; }
/// <summary>
/// has this formular already been disposed ?
/// </summary>
public bool IsDisposed { get; set; }
public List<ControlBase> Controls { get; set; }
/// <summary>
/// Cleanup
/// </summary>
public void Dispose()
{
Client = null;
Device = null;
IsDisposed = true;
}
public EventHandlerList Events = new EventHandlerList();
private static readonly object EvInit = new object();
private static readonly object EvOpened = new object();
private static readonly object EvClosed = new object();
public FormBase()
public async Task OnInit(InitEventArgs e)
{
var handler = Events[EvInit]?.GetInvocationList().Cast<AsyncEventHandler<InitEventArgs>>();
if (handler == null)
{
Controls = new List<ControlBase>();
return;
}
public FormBase(MessageClient client) : this()
foreach (var h in handler)
{
this.Client = client;
}
public async Task OnInit(InitEventArgs e)
{
var handler = Events[EvInit]?.GetInvocationList().Cast<AsyncEventHandler<InitEventArgs>>();
if (handler == null)
return;
foreach (var h in handler)
{
await h.InvokeAllAsync(this, e);
}
}
///// <summary>
///// Will get called at the initialization (once per context)
///// </summary>
public event AsyncEventHandler<InitEventArgs> Init
{
add => Events.AddHandler(EvInit, value);
remove => Events.RemoveHandler(EvInit, value);
}
public async Task OnOpened(EventArgs e)
{
var handler = Events[EvOpened]?.GetInvocationList().Cast<AsyncEventHandler<EventArgs>>();
if (handler == null)
return;
foreach (var h in handler)
{
await h.InvokeAllAsync(this, e);
}
}
/// <summary>
/// Gets invoked if gets navigated to this form
/// </summary>
/// <returns></returns>
public event AsyncEventHandler<EventArgs> Opened
{
add => Events.AddHandler(EvOpened, value);
remove => Events.RemoveHandler(EvOpened, value);
}
public async Task OnClosed(EventArgs e)
{
var handler = Events[EvClosed]?.GetInvocationList().Cast<AsyncEventHandler<EventArgs>>();
if (handler == null)
return;
foreach (var h in handler)
{
await h.InvokeAllAsync(this, e);
}
}
/// <summary>
/// Form has been closed (left)
/// </summary>
/// <returns></returns>
public event AsyncEventHandler<EventArgs> Closed
{
add => Events.AddHandler(EvClosed, value);
remove => Events.RemoveHandler(EvClosed, value);
}
/// <summary>
/// Get invoked when a modal child from has been closed.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task ReturnFromModal(ModalDialog modal)
{
return Task.CompletedTask;
}
/// <summary>
/// Pre to form close, cleanup all controls
/// </summary>
/// <returns></returns>
public Task CloseControls()
{
foreach (var b in Controls)
{
b.Cleanup().Wait();
}
return Task.CompletedTask;
}
public virtual Task PreLoad(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if a message was sent or an action triggered
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task LoadControls(MessageResult message)
{
//Looking for the control by id, if not listened, raise event for all
if (message.RawData?.StartsWith("#c") ?? false)
{
var c = Controls.FirstOrDefault(a => a.ControlId == message.RawData.Split('_')[0]);
if (c != null)
{
await c.Load(message);
return;
}
}
foreach (var b in Controls)
{
if (!b.Enabled)
continue;
await b.Load(message);
}
}
/// <summary>
/// Gets invoked if the form gets loaded and on every message belongs to this context
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Load(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked, when a messages has been edited.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Edited(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if the user clicked a button.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task ActionControls(MessageResult message)
{
//Looking for the control by id, if not listened, raise event for all
if (message.RawData.StartsWith("#c"))
{
var c = Controls.FirstOrDefault(a => a.ControlId == message.RawData.Split('_')[0]);
if (c != null)
{
await c.Action(message, message.RawData.Split('_')[1]);
return;
}
}
foreach (var b in Controls)
{
if (!b.Enabled)
continue;
await b.Action(message);
if (message.Handled)
return;
}
}
/// <summary>
/// Gets invoked if the user has clicked a button.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Action(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if the user has sent some media (Photo, Audio, Video, Contact, Location, Document)
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task SentData(DataResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked at the end of the cycle to "Render" text, images, buttons, etc...
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task RenderControls(MessageResult message)
{
foreach (var b in Controls)
{
if (!b.Enabled)
continue;
await b.Render(message);
}
}
/// <summary>
/// Gets invoked at the end of the cycle to "Render" text, images, buttons, etc...
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Render(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Navigates to a new form
/// </summary>
/// <param name="newForm"></param>
/// <returns></returns>
public virtual async Task NavigateTo(FormBase newForm, params object[] args)
{
var ds = Device;
if (ds == null)
return;
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = newForm;
newForm.Client = Client;
newForm.Device = ds;
//Notify prior to close
foreach (var b in Controls)
{
if (!b.Enabled)
continue;
await b.Hidden(true);
}
CloseControls().Wait();
await OnClosed(EventArgs.Empty);
await newForm.OnInit(new InitEventArgs(args));
await newForm.OnOpened(EventArgs.Empty);
}
/// <summary>
/// Opens this form modal, but don't closes the original ones
/// </summary>
/// <param name="newForm"></param>
/// <returns></returns>
public virtual async Task OpenModal(ModalDialog newForm, params object[] args)
{
var ds = Device;
if (ds == null)
return;
var parentForm = this;
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = newForm;
newForm.Client = parentForm.Client;
newForm.Device = ds;
newForm.ParentForm = parentForm;
newForm.Closed += async (s, en) =>
{
await CloseModal(newForm, parentForm);
};
foreach (var b in Controls)
{
if (!b.Enabled)
continue;
await b.Hidden(false);
}
await newForm.OnInit(new InitEventArgs(args));
await newForm.OnOpened(EventArgs.Empty);
}
public Task CloseModal(ModalDialog modalForm, FormBase oldForm)
{
var ds = Device;
if (ds == null)
return Task.CompletedTask;
if (modalForm == null)
throw new Exception("No modal form");
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = oldForm;
return Task.CompletedTask;
}
/// <summary>
/// Adds a control to the formular and sets its ID and Device.
/// </summary>
/// <param name="control"></param>
public void AddControl(ControlBase control)
{
//Duplicate check
if (Controls.Contains(control))
throw new ArgumentException("Control has been already added.");
control.Id = Controls.Count + 1;
control.Device = Device;
Controls.Add(control);
control.Init();
}
/// <summary>
/// Removes control from the formular and runs a cleanup on it.
/// </summary>
/// <param name="control"></param>
public void RemoveControl(ControlBase control)
{
if (!Controls.Contains(control))
return;
control.Cleanup().Wait();
Controls.Remove(control);
}
/// <summary>
/// Removes all controls.
/// </summary>
public void RemoveAllControls()
{
foreach(var c in Controls)
{
c.Cleanup().Wait();
Controls.Remove(c);
}
}
/// <summary>
/// Cleanup
/// </summary>
public void Dispose()
{
Client = null;
Device = null;
IsDisposed = true;
await h.InvokeAllAsync(this, e);
}
}
}
///// <summary>
///// Will get called at the initialization (once per context)
///// </summary>
public event AsyncEventHandler<InitEventArgs> Init
{
add => Events.AddHandler(EvInit, value);
remove => Events.RemoveHandler(EvInit, value);
}
public async Task OnOpened(EventArgs e)
{
var handler = Events[EvOpened]?.GetInvocationList().Cast<AsyncEventHandler<EventArgs>>();
if (handler == null)
{
return;
}
foreach (var h in handler)
{
await h.InvokeAllAsync(this, e);
}
}
/// <summary>
/// Gets invoked if gets navigated to this form
/// </summary>
/// <returns></returns>
public event AsyncEventHandler<EventArgs> Opened
{
add => Events.AddHandler(EvOpened, value);
remove => Events.RemoveHandler(EvOpened, value);
}
public async Task OnClosed(EventArgs e)
{
var handler = Events[EvClosed]?.GetInvocationList().Cast<AsyncEventHandler<EventArgs>>();
if (handler == null)
{
return;
}
foreach (var h in handler)
{
await h.InvokeAllAsync(this, e);
}
}
/// <summary>
/// Form has been closed (left)
/// </summary>
/// <returns></returns>
public event AsyncEventHandler<EventArgs> Closed
{
add => Events.AddHandler(EvClosed, value);
remove => Events.RemoveHandler(EvClosed, value);
}
/// <summary>
/// Get invoked when a modal child from has been closed.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task ReturnFromModal(ModalDialog modal)
{
return Task.CompletedTask;
}
/// <summary>
/// Pre to form close, cleanup all controls
/// </summary>
/// <returns></returns>
public Task CloseControls()
{
foreach (var b in Controls)
{
b.Cleanup().Wait();
}
return Task.CompletedTask;
}
public virtual Task PreLoad(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if a message was sent or an action triggered
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task LoadControls(MessageResult message)
{
//Looking for the control by id, if not listened, raise event for all
if (message.RawData?.StartsWith("#c") ?? false)
{
var c = Controls.FirstOrDefault(a => a.ControlId == message.RawData.Split('_')[0]);
if (c != null)
{
await c.Load(message);
return;
}
}
foreach (var b in Controls)
{
if (!b.Enabled)
{
continue;
}
await b.Load(message);
}
}
/// <summary>
/// Gets invoked if the form gets loaded and on every message belongs to this context
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Load(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked, when a messages has been edited.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Edited(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if the user clicked a button.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task ActionControls(MessageResult message)
{
//Looking for the control by id, if not listened, raise event for all
if (message.RawData.StartsWith("#c"))
{
var c = Controls.FirstOrDefault(a => a.ControlId == message.RawData.Split('_')[0]);
if (c != null)
{
await c.Action(message, message.RawData.Split('_')[1]);
return;
}
}
foreach (var b in Controls)
{
if (!b.Enabled)
{
continue;
}
await b.Action(message);
if (message.Handled)
{
return;
}
}
}
/// <summary>
/// Gets invoked if the user has clicked a button.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Action(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked if the user has sent some media (Photo, Audio, Video, Contact, Location, Document)
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task SentData(DataResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Gets invoked at the end of the cycle to "Render" text, images, buttons, etc...
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual async Task RenderControls(MessageResult message)
{
foreach (var b in Controls)
{
if (!b.Enabled)
{
continue;
}
await b.Render(message);
}
}
/// <summary>
/// Gets invoked at the end of the cycle to "Render" text, images, buttons, etc...
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public virtual Task Render(MessageResult message)
{
return Task.CompletedTask;
}
/// <summary>
/// Navigates to a new form
/// </summary>
/// <param name="newForm"></param>
/// <returns></returns>
public virtual async Task NavigateTo(FormBase newForm, params object[] args)
{
var ds = Device;
if (ds == null)
{
return;
}
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = newForm;
newForm.Client = Client;
newForm.Device = ds;
//Notify prior to close
foreach (var b in Controls)
{
if (!b.Enabled)
{
continue;
}
await b.Hidden(true);
}
CloseControls().Wait();
await OnClosed(EventArgs.Empty);
await newForm.OnInit(new InitEventArgs(args));
await newForm.OnOpened(EventArgs.Empty);
}
/// <summary>
/// Opens this form modal, but don't closes the original ones
/// </summary>
/// <param name="newForm"></param>
/// <returns></returns>
public virtual async Task OpenModal(ModalDialog newForm, params object[] args)
{
var ds = Device;
if (ds == null)
{
return;
}
var parentForm = this;
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = newForm;
newForm.Client = parentForm.Client;
newForm.Device = ds;
newForm.ParentForm = parentForm;
newForm.Closed += async (s, en) => { await CloseModal(newForm, parentForm); };
foreach (var b in Controls)
{
if (!b.Enabled)
{
continue;
}
await b.Hidden(false);
}
await newForm.OnInit(new InitEventArgs(args));
await newForm.OnOpened(EventArgs.Empty);
}
public Task CloseModal(ModalDialog modalForm, FormBase oldForm)
{
var ds = Device;
if (ds == null)
{
return Task.CompletedTask;
}
if (modalForm == null)
{
throw new Exception("No modal form");
}
ds.FormSwitched = true;
ds.PreviousForm = ds.ActiveForm;
ds.ActiveForm = oldForm;
return Task.CompletedTask;
}
/// <summary>
/// Adds a control to the formular and sets its ID and Device.
/// </summary>
/// <param name="control"></param>
public void AddControl(ControlBase control)
{
//Duplicate check
if (Controls.Contains(control))
{
throw new ArgumentException("Control has been already added.");
}
control.Id = Controls.Count + 1;
control.Device = Device;
Controls.Add(control);
control.Init();
}
/// <summary>
/// Removes control from the formular and runs a cleanup on it.
/// </summary>
/// <param name="control"></param>
public void RemoveControl(ControlBase control)
{
if (!Controls.Contains(control))
{
return;
}
control.Cleanup().Wait();
Controls.Remove(control);
}
/// <summary>
/// Removes all controls.
/// </summary>
public void RemoveAllControls()
{
foreach (var c in Controls)
{
c.Cleanup().Wait();
Controls.Remove(c);
}
}
}

View File

@ -10,193 +10,186 @@ using Telegram.Bot.Exceptions;
using Telegram.Bot.Extensions.Polling;
using Telegram.Bot.Types;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
/// <summary>
/// Base class for message handling
/// </summary>
public class MessageClient
{
/// <summary>
/// Base class for message handling
/// </summary>
public class MessageClient
private static readonly object EvOnMessageLoop = new();
private static object __evOnMessage = new();
private static object __evOnMessageEdit = new();
private static object __evCallbackQuery = new();
private CancellationTokenSource _cancellationTokenSource;
public MessageClient(string apiKey)
{
ApiKey = apiKey;
TelegramClient = new TelegramBotClient(apiKey);
public string ApiKey { get; set; }
public ITelegramBotClient TelegramClient { get; set; }
private EventHandlerList Events { get; set; } = new EventHandlerList();
private static readonly object EvOnMessageLoop = new object();
private static object __evOnMessage = new object();
private static object __evOnMessageEdit = new object();
private static object __evCallbackQuery = new object();
private CancellationTokenSource _cancellationTokenSource;
public MessageClient(string apiKey)
{
this.ApiKey = apiKey;
TelegramClient = new TelegramBotClient(apiKey);
Prepare();
}
public MessageClient(string apiKey, HttpClient proxy)
{
this.ApiKey = apiKey;
TelegramClient = new TelegramBotClient(apiKey, proxy);
Prepare();
}
public MessageClient(string apiKey, Uri proxyUrl, NetworkCredential credential = null)
{
this.ApiKey = apiKey;
var proxy = new WebProxy(proxyUrl)
{
Credentials = credential
};
var httpClient = new HttpClient(
new HttpClientHandler { Proxy = proxy, UseProxy = true }
);
TelegramClient = new TelegramBotClient(apiKey, httpClient);
Prepare();
}
/// <summary>
/// Initializes the client with a proxy
/// </summary>
/// <param name="apiKey"></param>
/// <param name="proxyHost">i.e. 127.0.0.1</param>
/// <param name="proxyPort">i.e. 10000</param>
public MessageClient(string apiKey, string proxyHost, int proxyPort)
{
this.ApiKey = apiKey;
var proxy = new WebProxy(proxyHost, proxyPort);
var httpClient = new HttpClient(
new HttpClientHandler { Proxy = proxy, UseProxy = true }
);
TelegramClient = new TelegramBotClient(apiKey, httpClient);
Prepare();
}
public MessageClient(string apiKey, TelegramBotClient client)
{
this.ApiKey = apiKey;
TelegramClient = client;
Prepare();
}
public void Prepare()
{
TelegramClient.Timeout = new TimeSpan(0, 0, 30);
}
public void StartReceiving()
{
_cancellationTokenSource = new CancellationTokenSource();
var receiverOptions = new ReceiverOptions();
TelegramClient.StartReceiving(HandleUpdateAsync, HandleErrorAsync, receiverOptions, _cancellationTokenSource.Token);
}
public void StopReceiving()
{
_cancellationTokenSource.Cancel();
}
public Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
OnMessageLoop(new UpdateResult(update, null));
return Task.CompletedTask;
}
public Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
if (exception is ApiRequestException exApi)
{
Console.WriteLine($"Telegram API Error:\n[{exApi.ErrorCode}]\n{exApi.Message}");
}
else
{
Console.WriteLine(exception.ToString());
}
return Task.CompletedTask;
}
/// <summary>
/// This will return the current list of bot commands.
/// </summary>
/// <returns></returns>
public async Task<BotCommand[]> GetBotCommands(BotCommandScope scope = null, string languageCode = null)
{
return await TelegramClient.GetMyCommandsAsync(scope, languageCode);
}
/// <summary>
/// This will set your bot commands to the given list.
/// </summary>
/// <param name="botcommands"></param>
/// <returns></returns>
public async Task SetBotCommands(List<BotCommand> botcommands, BotCommandScope scope = null, string languageCode = null)
{
await TelegramClient.SetMyCommandsAsync(botcommands, scope, languageCode);
}
/// <summary>
/// This will delete the current list of bot commands.
/// </summary>
/// <returns></returns>
public async Task DeleteBotCommands(BotCommandScope scope = null, string languageCode = null)
{
await TelegramClient.DeleteMyCommandsAsync(scope, languageCode);
}
#region "Events"
public event Async.AsyncEventHandler<UpdateResult> MessageLoop
{
add => Events.AddHandler(EvOnMessageLoop, value);
remove => Events.RemoveHandler(EvOnMessageLoop, value);
}
public void OnMessageLoop(UpdateResult update)
{
(Events[EvOnMessageLoop] as Async.AsyncEventHandler<UpdateResult>)?.Invoke(this, update);
}
#endregion
Prepare();
}
}
public MessageClient(string apiKey, HttpClient proxy)
{
ApiKey = apiKey;
TelegramClient = new TelegramBotClient(apiKey, proxy);
Prepare();
}
public MessageClient(string apiKey, Uri proxyUrl, NetworkCredential credential = null)
{
ApiKey = apiKey;
var proxy = new WebProxy(proxyUrl)
{
Credentials = credential
};
var httpClient = new HttpClient(
new HttpClientHandler { Proxy = proxy, UseProxy = true }
);
TelegramClient = new TelegramBotClient(apiKey, httpClient);
Prepare();
}
/// <summary>
/// Initializes the client with a proxy
/// </summary>
/// <param name="apiKey"></param>
/// <param name="proxyHost">i.e. 127.0.0.1</param>
/// <param name="proxyPort">i.e. 10000</param>
public MessageClient(string apiKey, string proxyHost, int proxyPort)
{
ApiKey = apiKey;
var proxy = new WebProxy(proxyHost, proxyPort);
var httpClient = new HttpClient(
new HttpClientHandler { Proxy = proxy, UseProxy = true }
);
TelegramClient = new TelegramBotClient(apiKey, httpClient);
Prepare();
}
public MessageClient(string apiKey, TelegramBotClient client)
{
ApiKey = apiKey;
TelegramClient = client;
Prepare();
}
public string ApiKey { get; set; }
public ITelegramBotClient TelegramClient { get; set; }
private EventHandlerList Events { get; } = new();
public void Prepare()
{
TelegramClient.Timeout = new TimeSpan(0, 0, 30);
}
public void StartReceiving()
{
_cancellationTokenSource = new CancellationTokenSource();
var receiverOptions = new ReceiverOptions();
TelegramClient.StartReceiving(HandleUpdateAsync, HandleErrorAsync, receiverOptions,
_cancellationTokenSource.Token);
}
public void StopReceiving()
{
_cancellationTokenSource.Cancel();
}
public Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
OnMessageLoop(new UpdateResult(update, null));
return Task.CompletedTask;
}
public Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception,
CancellationToken cancellationToken)
{
if (exception is ApiRequestException exApi)
{
Console.WriteLine($"Telegram API Error:\n[{exApi.ErrorCode}]\n{exApi.Message}");
}
else
{
Console.WriteLine(exception.ToString());
}
return Task.CompletedTask;
}
/// <summary>
/// This will return the current list of bot commands.
/// </summary>
/// <returns></returns>
public async Task<BotCommand[]> GetBotCommands(BotCommandScope scope = null, string languageCode = null)
{
return await TelegramClient.GetMyCommandsAsync(scope, languageCode);
}
/// <summary>
/// This will set your bot commands to the given list.
/// </summary>
/// <param name="botcommands"></param>
/// <returns></returns>
public async Task SetBotCommands(List<BotCommand> botcommands, BotCommandScope scope = null,
string languageCode = null)
{
await TelegramClient.SetMyCommandsAsync(botcommands, scope, languageCode);
}
/// <summary>
/// This will delete the current list of bot commands.
/// </summary>
/// <returns></returns>
public async Task DeleteBotCommands(BotCommandScope scope = null, string languageCode = null)
{
await TelegramClient.DeleteMyCommandsAsync(scope, languageCode);
}
#region "Events"
public event Async.AsyncEventHandler<UpdateResult> MessageLoop
{
add => Events.AddHandler(EvOnMessageLoop, value);
remove => Events.RemoveHandler(EvOnMessageLoop, value);
}
public void OnMessageLoop(UpdateResult update)
{
(Events[EvOnMessageLoop] as Async.AsyncEventHandler<UpdateResult>)?.Invoke(this, update);
}
#endregion
}

View File

@ -5,136 +5,134 @@ using Newtonsoft.Json;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
public class MessageResult : ResultBase
{
public class MessageResult : ResultBase
internal MessageResult()
{
}
public Update UpdateData { get; set; }
public MessageResult(Update update)
{
UpdateData = update;
}
/// <summary>
/// Returns the Device/ChatId
/// </summary>
public override long DeviceId =>
UpdateData?.Message?.Chat?.Id
?? UpdateData?.EditedMessage?.Chat.Id
?? UpdateData?.CallbackQuery.Message?.Chat.Id
?? Device?.DeviceId
?? 0;
public Update UpdateData { get; set; }
/// <summary>
/// The message id
/// </summary>
public new int MessageId =>
UpdateData?.Message?.MessageId
?? Message?.MessageId
?? UpdateData?.CallbackQuery?.Message?.MessageId
?? 0;
/// <summary>
/// Returns the Device/ChatId
/// </summary>
public override long DeviceId =>
UpdateData?.Message?.Chat?.Id
?? UpdateData?.EditedMessage?.Chat.Id
?? UpdateData?.CallbackQuery.Message?.Chat.Id
?? Device?.DeviceId
?? 0;
public string Command => UpdateData?.Message?.Text ?? "";
/// <summary>
/// The message id
/// </summary>
public new int MessageId =>
UpdateData?.Message?.MessageId
?? Message?.MessageId
?? UpdateData?.CallbackQuery?.Message?.MessageId
?? 0;
public string MessageText => UpdateData?.Message?.Text ?? "";
public string Command => UpdateData?.Message?.Text ?? "";
public MessageType MessageType => Message?.Type ?? MessageType.Unknown;
public string MessageText => UpdateData?.Message?.Text ?? "";
/// <summary>
/// Is this an action ? (i.e. button click)
/// </summary>
public bool IsAction => (UpdateData.CallbackQuery != null);
public MessageType MessageType => Message?.Type ?? MessageType.Unknown;
/// <summary>
/// Is this a command ? Starts with a slash '/' and a command
/// </summary>
public bool IsBotCommand => (MessageText.StartsWith("/"));
/// <summary>
/// Is this an action ? (i.e. button click)
/// </summary>
public bool IsAction => UpdateData.CallbackQuery != null;
/// <summary>
/// Returns a List of all parameters which has been sent with the command itself (i.e. /start 123 456 789 => 123,456,789)
/// </summary>
public List<string> BotCommandParameters
/// <summary>
/// Is this a command ? Starts with a slash '/' and a command
/// </summary>
public bool IsBotCommand => MessageText.StartsWith("/");
/// <summary>
/// Returns a List of all parameters which has been sent with the command itself (i.e. /start 123 456 789 =>
/// 123,456,789)
/// </summary>
public List<string> BotCommandParameters
{
get
{
get
if (!IsBotCommand)
{
if (!IsBotCommand)
return new List<string>();
//Split by empty space and skip first entry (command itself), return as list
return MessageText.Split(' ').Skip(1).ToList();
}
}
/// <summary>
/// Returns just the command (i.e. /start 1 2 3 => /start)
/// </summary>
public string BotCommand
{
get
{
if (!IsBotCommand)
return null;
return MessageText.Split(' ')[0];
}
}
/// <summary>
/// Returns if this message will be used on the first form or not.
/// </summary>
public bool IsFirstHandler { get; set; } = true;
public bool Handled { get; set; } = false;
public string RawData => UpdateData?.CallbackQuery?.Data;
public T GetData<T>()
where T : class
{
T cd = null;
try
{
cd = JsonConvert.DeserializeObject<T>(RawData);
return cd;
}
catch
{
return new List<string>();
}
return null;
//Split by empty space and skip first entry (command itself), return as list
return MessageText.Split(' ').Skip(1).ToList();
}
}
/// <summary>
/// Confirm incomming action (i.e. Button click)
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task ConfirmAction(string message = "", bool showAlert = false, string urlToOpen = null)
/// <summary>
/// Returns just the command (i.e. /start 1 2 3 => /start)
/// </summary>
public string BotCommand
{
get
{
await Device.ConfirmAction(UpdateData.CallbackQuery.Id, message, showAlert, urlToOpen);
}
public override async Task DeleteMessage()
{
try
if (!IsBotCommand)
{
await base.DeleteMessage(MessageId);
return null;
}
catch
{
}
return MessageText.Split(' ')[0];
}
}
internal MessageResult()
/// <summary>
/// Returns if this message will be used on the first form or not.
/// </summary>
public bool IsFirstHandler { get; set; } = true;
public bool Handled { get; set; } = false;
public string RawData => UpdateData?.CallbackQuery?.Data;
public T GetData<T>()
where T : class
{
T cd = null;
try
{
cd = JsonConvert.DeserializeObject<T>(RawData);
return cd;
}
public MessageResult(Update update)
catch
{
UpdateData = update;
}
return null;
}
/// <summary>
/// Confirm incomming action (i.e. Button click)
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public async Task ConfirmAction(string message = "", bool showAlert = false, string urlToOpen = null)
{
await Device.ConfirmAction(UpdateData.CallbackQuery.Id, message, showAlert, urlToOpen);
}
public override async Task DeleteMessage()
{
try
{
await base.DeleteMessage(MessageId);
}
catch
{
}
}
}

View File

@ -4,48 +4,42 @@ using Telegram.Bot;
using Telegram.Bot.Types;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
public class ResultBase : EventArgs
{
public class ResultBase : EventArgs
public DeviceSession Device { get; set; }
public virtual long DeviceId { get; set; }
public int MessageId => Message.MessageId;
public virtual Message Message { get; set; }
/// <summary>
/// Deletes the current message
/// </summary>
/// <param name="messageId"></param>
/// <returns></returns>
public virtual async Task DeleteMessage()
{
public DeviceSession Device
{
get;
set;
}
public virtual long DeviceId { get; set; }
public int MessageId => Message.MessageId;
public virtual Message Message { get; set; }
/// <summary>
/// Deletes the current message
/// </summary>
/// <param name="messageId"></param>
/// <returns></returns>
public virtual async Task DeleteMessage()
{
await DeleteMessage(MessageId);
}
/// <summary>
///Deletes the current message or the given one.
/// </summary>
/// <param name="messageId"></param>
/// <returns></returns>
public virtual async Task DeleteMessage(int messageId = -1)
{
try
{
await Device.Client.TelegramClient.DeleteMessageAsync(DeviceId, (messageId == -1 ? MessageId : messageId));
}
catch
{
}
}
await DeleteMessage(MessageId);
}
}
/// <summary>
/// Deletes the current message or the given one.
/// </summary>
/// <param name="messageId"></param>
/// <returns></returns>
public virtual async Task DeleteMessage(int messageId = -1)
{
try
{
await Device.Client.TelegramClient.DeleteMessageAsync(DeviceId,
messageId == -1 ? MessageId : messageId);
}
catch
{
}
}
}

View File

@ -1,32 +1,24 @@
using System.Collections.Generic;
using System.Linq;
namespace TelegramBotBase.Base
namespace TelegramBotBase.Base;
public class StateContainer
{
public class StateContainer
public StateContainer()
{
public List<StateEntry> States { get; set; }
public List<long> ChatIds
{
get
{
return States.Where(a => a.DeviceId > 0).Select(a => a.DeviceId).ToList();
}
}
public List<long> GroupIds
{
get
{
return States.Where(a => a.DeviceId < 0).Select(a => a.DeviceId).ToList();
}
}
public StateContainer()
{
States = new List<StateEntry>();
}
States = new List<StateEntry>();
}
}
public List<StateEntry> States { get; set; }
public List<long> ChatIds
{
get { return States.Where(a => a.DeviceId > 0).Select(a => a.DeviceId).ToList(); }
}
public List<long> GroupIds
{
get { return States.Where(a => a.DeviceId < 0).Select(a => a.DeviceId).ToList(); }
}
}

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