fix: reformat using C# rules
This commit is contained in:
parent
a731e2a8d0
commit
5ab15621a0
@ -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>
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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")]
|
||||
@ -46,8 +46,6 @@ namespace AsyncFormUpdates.forms
|
||||
var m = await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
|
||||
_messageId = m.MessageId;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -38,7 +38,5 @@ namespace AsyncFormUpdates.forms
|
||||
|
||||
await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -9,4 +9,4 @@ public class BotDbContext : DbContext
|
||||
}
|
||||
|
||||
public DbSet<User> Users { get; set; }
|
||||
}
|
||||
}
|
||||
@ -4,4 +4,4 @@ public class User
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public string LastMessage { get; set; }
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
@ -33,4 +33,4 @@ public class StartForm : FormBase
|
||||
user.LastMessage = string.IsNullOrWhiteSpace(message.MessageText) ? "<unknown>" : message.MessageText;
|
||||
await _dbContext.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
@ -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
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3,6 +3,5 @@
|
||||
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images/)
|
||||
[](https://www.t.me/tgbotbase)
|
||||
|
||||
|
||||
[](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
|
||||
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images)
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -3,7 +3,6 @@
|
||||
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL/)
|
||||
[](https://www.t.me/tgbotbase)
|
||||
|
||||
|
||||
[](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
|
||||
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL)
|
||||
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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>
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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")]
|
||||
@ -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>
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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}");
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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.");
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
146
TelegramBotBase.Test/Tests/DataSources/CustomDataSource.cs
Normal file
146
TelegramBotBase.Test/Tests/DataSources/CustomDataSource.cs
Normal 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));
|
||||
}
|
||||
}
|
||||
51
TelegramBotBase.Test/Tests/DataSources/List.cs
Normal file
51
TelegramBotBase.Test/Tests/DataSources/List.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\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\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$";
|
||||
var r = new Regex(pattern);
|
||||
|
||||
var matches = r.Matches(tmp);
|
||||
|
||||
return matches.Count > 0;
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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");
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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];
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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; }
|
||||
}
|
||||
@ -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)));
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
|
||||
}
|
||||
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -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
Loading…
x
Reference in New Issue
Block a user