Projektdateien hinzufügen.
This commit is contained in:
parent
c0e14a707d
commit
7ac450140f
3
Bot.txt
Normal file
3
Bot.txt
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
@TGBaseBot
|
||||||
|
|
||||||
|
480896099:AAHo0KIurkdugqdZ1tYh7sik3tJ9guH2uuI
|
||||||
28
Telegram.sln
Normal file
28
Telegram.sln
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
|
# Visual Studio 14
|
||||||
|
VisualStudioVersion = 14.0.25420.1
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelegramBaseTest", "TelegramBaseTest\TelegramBaseTest.csproj", "{5817184C-0D59-4924-AC6C-6B943967811C}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TelegramBotBase", "TelegramBotBase\TelegramBotBase.csproj", "{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
Debug|Any CPU = Debug|Any CPU
|
||||||
|
Release|Any CPU = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{5817184C-0D59-4924-AC6C-6B943967811C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{5817184C-0D59-4924-AC6C-6B943967811C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{5817184C-0D59-4924-AC6C-6B943967811C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{5817184C-0D59-4924-AC6C-6B943967811C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
||||||
6
TelegramBaseTest/App.config
Normal file
6
TelegramBaseTest/App.config
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8" ?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
||||||
|
</startup>
|
||||||
|
</configuration>
|
||||||
64
TelegramBaseTest/Program.cs
Normal file
64
TelegramBaseTest/Program.cs
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Tests;
|
||||||
|
|
||||||
|
namespace TelegramBaseTest
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BotBase<TestForm> bb = new BotBase<TestForm>("480896099:AAHo0KIurkdugqdZ1tYh7sik3tJ9guH2uuI");
|
||||||
|
|
||||||
|
bb.SystemCalls.Add("/start");
|
||||||
|
bb.SystemCalls.Add("/form1");
|
||||||
|
bb.SystemCalls.Add("/form2");
|
||||||
|
|
||||||
|
bb.SystemCall += (s, en) =>
|
||||||
|
{
|
||||||
|
switch(en.Command)
|
||||||
|
{
|
||||||
|
case "/form1":
|
||||||
|
|
||||||
|
var form1 = new TestForm();
|
||||||
|
form1.Init();
|
||||||
|
|
||||||
|
en.Device.ActiveForm.NavigateTo(form1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "/form2":
|
||||||
|
|
||||||
|
var form2 = new TestForm2();
|
||||||
|
form2.Init();
|
||||||
|
|
||||||
|
en.Device.ActiveForm.NavigateTo(form2);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
bb.Start();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Console.WriteLine("Telegram Bot started...");
|
||||||
|
|
||||||
|
Console.WriteLine("Press q to quit application.");
|
||||||
|
|
||||||
|
|
||||||
|
Console.ReadLine();
|
||||||
|
|
||||||
|
bb.Stop();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
36
TelegramBaseTest/Properties/AssemblyInfo.cs
Normal file
36
TelegramBaseTest/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
// die einer Assembly zugeordnet sind.
|
||||||
|
[assembly: AssemblyTitle("TelegramBaseTest")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("TelegramBaseTest")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
|
||||||
|
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
|
||||||
|
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||||
|
[assembly: Guid("5817184c-0d59-4924-ac6c-6b943967811c")]
|
||||||
|
|
||||||
|
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
//
|
||||||
|
// Hauptversion
|
||||||
|
// Nebenversion
|
||||||
|
// Buildnummer
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||||
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
66
TelegramBaseTest/TelegramBaseTest.csproj
Normal file
66
TelegramBaseTest/TelegramBaseTest.csproj
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" 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>{5817184C-0D59-4924-AC6C-6B943967811C}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>TelegramBaseTest</RootNamespace>
|
||||||
|
<AssemblyName>TelegramBaseTest</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
</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="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" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj">
|
||||||
|
<Project>{a61eda27-cfdf-4bcb-b2d6-184f94904f2d}</Project>
|
||||||
|
<Name>TelegramBotBase</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
91
TelegramBotBase/Base/ActionResult.cs
Normal file
91
TelegramBotBase/Base/ActionResult.cs
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
//public class ActionResult : ResultBase
|
||||||
|
//{
|
||||||
|
// public Telegram.Bot.Args.CallbackQueryEventArgs RawCallbackData { get; set; }
|
||||||
|
|
||||||
|
// public override long DeviceId
|
||||||
|
// {
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return this.RawCallbackData?.CallbackQuery.Message?.Chat.Id ?? 0;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public String Command
|
||||||
|
// {
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return this.RawCallbackData.CallbackQuery.Message.Text ?? "";
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public String RawData
|
||||||
|
// {
|
||||||
|
// get
|
||||||
|
// {
|
||||||
|
// return this.RawCallbackData.CallbackQuery.Data;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public T GetData<T>()
|
||||||
|
// where T : class
|
||||||
|
// {
|
||||||
|
// T cd = null;
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// cd = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(this.RawData);
|
||||||
|
|
||||||
|
// return cd;
|
||||||
|
// }
|
||||||
|
// catch
|
||||||
|
// {
|
||||||
|
|
||||||
|
// }
|
||||||
|
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
|
||||||
|
// /// <summary>
|
||||||
|
// /// Bestätigt den Erhalt der Aktion.
|
||||||
|
// /// </summary>
|
||||||
|
// /// <param name="message"></param>
|
||||||
|
// /// <returns></returns>
|
||||||
|
// public async Task ConfirmAction(String message = "")
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// await this.Client.TelegramClient.AnswerCallbackQueryAsync(this.RawCallbackData.CallbackQuery.Id, message);
|
||||||
|
// }
|
||||||
|
// catch
|
||||||
|
// {
|
||||||
|
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public override async Task DeleteMessage()
|
||||||
|
// {
|
||||||
|
// try
|
||||||
|
// {
|
||||||
|
// await this.Client.TelegramClient.DeleteMessageAsync(this.DeviceId, this.RawCallbackData.CallbackQuery.Message.MessageId);
|
||||||
|
// }
|
||||||
|
// catch
|
||||||
|
// {
|
||||||
|
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
|
||||||
|
// public ActionResult(Telegram.Bot.Args.CallbackQueryEventArgs callback)
|
||||||
|
// {
|
||||||
|
// this.RawCallbackData = callback;
|
||||||
|
// this.Message = callback.CallbackQuery.Message;
|
||||||
|
// }
|
||||||
|
|
||||||
|
//}
|
||||||
|
}
|
||||||
26
TelegramBotBase/Base/ButtonClickedEventArgs.cs
Normal file
26
TelegramBotBase/Base/ButtonClickedEventArgs.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class ButtonClickedEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public ButtonBase Button { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public ButtonClickedEventArgs()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ButtonClickedEventArgs(ButtonBase button)
|
||||||
|
{
|
||||||
|
this.Button = button;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
126
TelegramBotBase/Base/MessageClient.cs
Normal file
126
TelegramBotBase/Base/MessageClient.cs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class MessageClient
|
||||||
|
{
|
||||||
|
|
||||||
|
public String APIKey { get; set; }
|
||||||
|
|
||||||
|
public Telegram.Bot.TelegramBotClient TelegramClient { get; set; }
|
||||||
|
|
||||||
|
private EventHandlerList __Events { get; set; } = new EventHandlerList();
|
||||||
|
|
||||||
|
private static object __evOnMessage = new object();
|
||||||
|
|
||||||
|
private static object __evCallbackQuery = new object();
|
||||||
|
|
||||||
|
|
||||||
|
public MessageClient(String APIKey)
|
||||||
|
{
|
||||||
|
this.APIKey = APIKey;
|
||||||
|
this.TelegramClient = new Telegram.Bot.TelegramBotClient(APIKey);
|
||||||
|
|
||||||
|
Prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageClient(String APIKey, Telegram.Bot.TelegramBotClient Client)
|
||||||
|
{
|
||||||
|
this.APIKey = APIKey;
|
||||||
|
this.TelegramClient = Client;
|
||||||
|
|
||||||
|
Prepare();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Prepare()
|
||||||
|
{
|
||||||
|
this.TelegramClient.Timeout = new TimeSpan(0, 0, 30);
|
||||||
|
|
||||||
|
|
||||||
|
this.TelegramClient.OnMessage += TelegramClient_OnMessage;
|
||||||
|
this.TelegramClient.OnCallbackQuery += TelegramClient_OnCallbackQuery;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async void TelegramClient_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
|
||||||
|
{
|
||||||
|
//Skip empty messages by default
|
||||||
|
if (e.Message == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var mr = new MessageResult(e);
|
||||||
|
mr.Client = this;
|
||||||
|
OnMessage(mr);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void TelegramClient_OnCallbackQuery(object sender, Telegram.Bot.Args.CallbackQueryEventArgs e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var ar = new MessageResult(e);
|
||||||
|
ar.Client = this;
|
||||||
|
OnAction(ar);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#region "Events"
|
||||||
|
|
||||||
|
public event EventHandler<MessageResult> Message
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evOnMessage, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evOnMessage, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnMessage(MessageResult result)
|
||||||
|
{
|
||||||
|
(this.__Events[__evOnMessage] as EventHandler<MessageResult>)?.Invoke(this, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<MessageResult> Action
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evCallbackQuery, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evCallbackQuery, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnAction(MessageResult result)
|
||||||
|
{
|
||||||
|
(this.__Events[__evCallbackQuery] as EventHandler<MessageResult>)?.Invoke(this, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
132
TelegramBotBase/Base/MessageResult.cs
Normal file
132
TelegramBotBase/Base/MessageResult.cs
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class MessageResult : ResultBase
|
||||||
|
{
|
||||||
|
public Telegram.Bot.Args.MessageEventArgs RawMessageData { get; set; }
|
||||||
|
|
||||||
|
public Telegram.Bot.Args.CallbackQueryEventArgs RawCallbackData { get; set; }
|
||||||
|
|
||||||
|
public override long DeviceId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.RawMessageData?.Message?.Chat.Id ?? this.RawCallbackData?.CallbackQuery.Message?.Chat.Id ?? 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Die Id der Nachricht
|
||||||
|
/// </summary>
|
||||||
|
public new int MessageId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Message?.MessageId ?? this.RawCallbackData?.CallbackQuery?.Message?.MessageId ?? 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Command
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.RawMessageData?.Message?.Text ?? "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String MessageText
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.RawMessageData?.Message?.Text ?? "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Ist diese eine Aktion? (z.B.: Button Klick)
|
||||||
|
/// </summary>
|
||||||
|
public bool IsAction
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return (this.RawCallbackData != null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Handled { get; set; } = false;
|
||||||
|
|
||||||
|
public String RawData
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.RawCallbackData.CallbackQuery.Data;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public T GetData<T>()
|
||||||
|
where T : class
|
||||||
|
{
|
||||||
|
T cd = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cd = Newtonsoft.Json.JsonConvert.DeserializeObject<T>(this.RawData);
|
||||||
|
|
||||||
|
return cd;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bestätigt den Erhalt der Aktion.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task ConfirmAction(String message = "")
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.Client.TelegramClient.AnswerCallbackQueryAsync(this.RawCallbackData.CallbackQuery.Id, message);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task DeleteMessage()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await base.DeleteMessage(this.MessageId);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public MessageResult(Telegram.Bot.Args.MessageEventArgs rawdata)
|
||||||
|
{
|
||||||
|
this.RawMessageData = rawdata;
|
||||||
|
this.Message = rawdata.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageResult(Telegram.Bot.Args.CallbackQueryEventArgs callback)
|
||||||
|
{
|
||||||
|
this.RawCallbackData = callback;
|
||||||
|
this.Message = callback.CallbackQuery.Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
29
TelegramBotBase/Base/MessageSentEventArgs.cs
Normal file
29
TelegramBotBase/Base/MessageSentEventArgs.cs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class MessageSentEventArgs
|
||||||
|
{
|
||||||
|
public int MessageId { get; set; }
|
||||||
|
|
||||||
|
public Message Message { get; set; }
|
||||||
|
|
||||||
|
public MessageSentEventArgs()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public MessageSentEventArgs(int MessageId, Message message)
|
||||||
|
{
|
||||||
|
this.MessageId = MessageId;
|
||||||
|
this.Message = message;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
53
TelegramBotBase/Base/ResultBase.cs
Normal file
53
TelegramBotBase/Base/ResultBase.cs
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class ResultBase
|
||||||
|
{
|
||||||
|
public MessageClient Client { get; set; }
|
||||||
|
|
||||||
|
public virtual long DeviceId { get; set; }
|
||||||
|
|
||||||
|
public int MessageId
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Message.MessageId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Telegram.Bot.Types.Message Message { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Löscht die aktuelle Nachricht, oder die übergebene
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messageId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual async Task DeleteMessage()
|
||||||
|
{
|
||||||
|
await DeleteMessage(this.MessageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Löscht die aktuelle Nachricht, oder die übergebene
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messageId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual async Task DeleteMessage(int messageId = -1)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.Client.TelegramClient.DeleteMessageAsync(this.DeviceId, (messageId == -1 ? this.MessageId : messageId));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
22
TelegramBotBase/Base/SessionBeginResult.cs
Normal file
22
TelegramBotBase/Base/SessionBeginResult.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class SessionBeginResult : EventArgs
|
||||||
|
{
|
||||||
|
public long DeviceId { get; set; }
|
||||||
|
|
||||||
|
public DeviceSession Device { get; set; }
|
||||||
|
|
||||||
|
public SessionBeginResult(long DeviceId, DeviceSession Device)
|
||||||
|
{
|
||||||
|
this.DeviceId = DeviceId;
|
||||||
|
this.Device = Device;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
33
TelegramBotBase/Base/SystemCallEventArgs.cs
Normal file
33
TelegramBotBase/Base/SystemCallEventArgs.cs
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class SystemCallEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
public String Command { get; set; }
|
||||||
|
|
||||||
|
public long DeviceId { get; set; }
|
||||||
|
|
||||||
|
public DeviceSession Device {get;set;}
|
||||||
|
|
||||||
|
|
||||||
|
public SystemCallEventArgs()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public SystemCallEventArgs(String Command, long DeviceId, DeviceSession Device)
|
||||||
|
{
|
||||||
|
this.Command = Command;
|
||||||
|
this.DeviceId = DeviceId;
|
||||||
|
this.Device = Device;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
36
TelegramBotBase/Base/SystemExceptionEventArgs.cs
Normal file
36
TelegramBotBase/Base/SystemExceptionEventArgs.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class SystemExceptionEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
|
||||||
|
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;
|
||||||
|
this.Error = error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
45
TelegramBotBase/Base/UnhandledCallEventArgs.cs
Normal file
45
TelegramBotBase/Base/UnhandledCallEventArgs.cs
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Base
|
||||||
|
{
|
||||||
|
public class UnhandledCallEventArgs : EventArgs
|
||||||
|
{
|
||||||
|
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()
|
||||||
|
{
|
||||||
|
this.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;
|
||||||
|
this.Message = message;
|
||||||
|
this.Device = Device;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
308
TelegramBotBase/BotBase.cs
Normal file
308
TelegramBotBase/BotBase.cs
Normal file
@ -0,0 +1,308 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase
|
||||||
|
{
|
||||||
|
public class BotBase<T>
|
||||||
|
where T : FormBase
|
||||||
|
{
|
||||||
|
public MessageClient Client { get; set; }
|
||||||
|
|
||||||
|
public String APIKey { get; set; } = "";
|
||||||
|
|
||||||
|
|
||||||
|
public SessionBase Sessions { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Beinhaltet Systembefehle die immer erreichbar sind und nicht an die Formulare weitergereicht werden. z.b. /start
|
||||||
|
/// </summary>
|
||||||
|
public List<String> SystemCalls { get; set; }
|
||||||
|
|
||||||
|
private EventHandlerList __Events = new EventHandlerList();
|
||||||
|
|
||||||
|
private static object __evSessionBegins = new object();
|
||||||
|
|
||||||
|
private static object __evSystemCall = new object();
|
||||||
|
|
||||||
|
private static object __evException = new object();
|
||||||
|
|
||||||
|
private static object __evUnhandledCall = new object();
|
||||||
|
|
||||||
|
public BotBase(String apiKey)
|
||||||
|
{
|
||||||
|
this.APIKey = apiKey;
|
||||||
|
|
||||||
|
this.Client = new Base.MessageClient(this.APIKey);
|
||||||
|
|
||||||
|
this.SystemCalls = new List<string>();
|
||||||
|
|
||||||
|
this.Sessions = new SessionBase();
|
||||||
|
this.Sessions.Client = this.Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Start()
|
||||||
|
{
|
||||||
|
if (this.Client == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.Client.Message += Client_Message;
|
||||||
|
this.Client.Action += Client_Action;
|
||||||
|
|
||||||
|
|
||||||
|
this.Client.TelegramClient.StartReceiving();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void Stop()
|
||||||
|
{
|
||||||
|
if (this.Client == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.Client.TelegramClient.StopReceiving();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public async Task SentToAll(String message)
|
||||||
|
{
|
||||||
|
if (this.Client == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var s in this.Sessions.SessionList)
|
||||||
|
{
|
||||||
|
await this.Client.TelegramClient.SendTextMessageAsync(s.Key, message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Client_Message(object sender, MessageResult e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Client_TryMessage(sender, e);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
|
||||||
|
OnException(new SystemExceptionEventArgs(e.Message.Text, ds?.DeviceId ?? -1, ds, ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Client_TryMessage(object sender, MessageResult e)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
|
||||||
|
if (ds == null)
|
||||||
|
{
|
||||||
|
ds = await this.Sessions.StartSession<T>(e.DeviceId);
|
||||||
|
|
||||||
|
ds.LastMessage = e.MessageId;
|
||||||
|
|
||||||
|
OnSessionBegins(new SessionBeginResult(e.DeviceId, ds));
|
||||||
|
}
|
||||||
|
|
||||||
|
ds.LastAction = DateTime.Now;
|
||||||
|
ds.LastMessage = e.MessageId;
|
||||||
|
|
||||||
|
|
||||||
|
//Ist das ein Systembefehl ?
|
||||||
|
if (e.Message.Text != null && this.SystemCalls.Contains(e.Message.Text))
|
||||||
|
{
|
||||||
|
var sce = new SystemCallEventArgs(e.Message.Text, ds.DeviceId, ds);
|
||||||
|
OnSystemCall(sce);
|
||||||
|
//return;
|
||||||
|
}
|
||||||
|
|
||||||
|
FormBase activeForm = null;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
//Sollten die Formulare gewechselt werden, alle durchgehen (maximal 10 Versuche, um Schleifen zu verhindern)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
|
||||||
|
activeForm = ds.ActiveForm;
|
||||||
|
|
||||||
|
//Wenn das Formular sich selbst um die Events kümmert, nicht weiter machen
|
||||||
|
if (activeForm.CustomEventManagement)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Pre Loading Event
|
||||||
|
await activeForm.PreLoad(e);
|
||||||
|
|
||||||
|
//Loading Event
|
||||||
|
await activeForm.Load(e);
|
||||||
|
|
||||||
|
////Action Event
|
||||||
|
//if (!activeForm.FormSwitched)
|
||||||
|
// await activeForm.Action(e);
|
||||||
|
|
||||||
|
//Render Event
|
||||||
|
if (!activeForm.FormSwitched)
|
||||||
|
await activeForm.Render(e);
|
||||||
|
|
||||||
|
} while (activeForm.FormSwitched && i < 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Client_Action(object sender, MessageResult e)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Client_TryAction(sender, e);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
|
||||||
|
OnException(new SystemExceptionEventArgs(e.Message.Text, ds?.DeviceId ?? -1, ds, ex));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async void Client_TryAction(object sender, MessageResult e)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.Sessions.GetSession(e.DeviceId);
|
||||||
|
if (ds == null)
|
||||||
|
{
|
||||||
|
ds = await this.Sessions.StartSession<T>(e.DeviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ds.LastAction = DateTime.Now;
|
||||||
|
ds.LastMessage = e.MessageId;
|
||||||
|
|
||||||
|
FormBase activeForm = null;
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
|
||||||
|
//Sollten die Formulare gewechselt werden, alle durchgehen (maximal 10 Versuche, um Schleifen zu verhindern)
|
||||||
|
do
|
||||||
|
{
|
||||||
|
i++;
|
||||||
|
|
||||||
|
activeForm = ds.ActiveForm;
|
||||||
|
|
||||||
|
//Wenn das Formular sich selbst um die Events kümmert, nicht weiter machen
|
||||||
|
if (activeForm.CustomEventManagement)
|
||||||
|
return;
|
||||||
|
|
||||||
|
//Pre Loading Event
|
||||||
|
await activeForm.PreLoad(e);
|
||||||
|
|
||||||
|
//Loading Event
|
||||||
|
await activeForm.Load(e);
|
||||||
|
|
||||||
|
//Action Event
|
||||||
|
if (!activeForm.FormSwitched)
|
||||||
|
{
|
||||||
|
await activeForm.Action(e);
|
||||||
|
|
||||||
|
if (!e.Handled)
|
||||||
|
{
|
||||||
|
var uhc = new UnhandledCallEventArgs(e.Message.Text, e.RawData, ds.DeviceId, e.MessageId, e.Message, ds);
|
||||||
|
OnUnhandledCall(uhc);
|
||||||
|
|
||||||
|
if (uhc.Handled)
|
||||||
|
{
|
||||||
|
if (activeForm.FormSwitched)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
//Render Event
|
||||||
|
if (!activeForm.FormSwitched)
|
||||||
|
await activeForm.Render(e);
|
||||||
|
|
||||||
|
} while (activeForm.FormSwitched && i < 10);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wird aufgerufen wenn eine Session begonnen wird
|
||||||
|
/// </summary>
|
||||||
|
|
||||||
|
public event EventHandler<SessionBeginResult> SessionBegins
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evSessionBegins, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evSessionBegins, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnSessionBegins(SessionBeginResult e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evSessionBegins] as EventHandler<SessionBeginResult>)?.Invoke(this, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<SystemCallEventArgs> SystemCall
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evSystemCall, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evSystemCall, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnSystemCall(SystemCallEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evSystemCall] as EventHandler<SystemCallEventArgs>)?.Invoke(this, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<SystemExceptionEventArgs> Exception
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evException, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evException, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnException(SystemExceptionEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evException] as EventHandler<SystemExceptionEventArgs>)?.Invoke(this, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public event EventHandler<UnhandledCallEventArgs> UnhandledCall
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evUnhandledCall, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evUnhandledCall, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnUnhandledCall(UnhandledCallEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evUnhandledCall] as EventHandler<UnhandledCallEventArgs>)?.Invoke(this, e);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
TelegramBotBase/Form/AlertDialog.cs
Normal file
25
TelegramBotBase/Form/AlertDialog.cs
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class AlertDialog : PromptDialog
|
||||||
|
{
|
||||||
|
public String ButtonText { get; set; }
|
||||||
|
|
||||||
|
public AlertDialog(String Message, String ButtonText, FormBase FormToOpen = null) : base(Message)
|
||||||
|
{
|
||||||
|
this.Buttons.Add(new ButtonBase(ButtonText, "ok"));
|
||||||
|
this.ButtonText = ButtonText;
|
||||||
|
|
||||||
|
if (FormToOpen != null)
|
||||||
|
this.ButtonForms.Add("ok", FormToOpen);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
108
TelegramBotBase/Form/ArrayPromptDialog.cs
Normal file
108
TelegramBotBase/Form/ArrayPromptDialog.cs
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class ArrayPromptDialog : FormBase
|
||||||
|
{
|
||||||
|
public String Message { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public ButtonBase[][] Buttons { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<String, FormBase> ButtonForms { get; set; } = new Dictionary<string, FormBase>();
|
||||||
|
|
||||||
|
private EventHandlerList __Events { get; set; } = new EventHandlerList();
|
||||||
|
|
||||||
|
private static object __evButtonClicked { get; } = new object();
|
||||||
|
|
||||||
|
public ArrayPromptDialog()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayPromptDialog(String Message)
|
||||||
|
{
|
||||||
|
this.Message = Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ArrayPromptDialog(String Message, params ButtonBase[][] Buttons)
|
||||||
|
{
|
||||||
|
this.Message = Message;
|
||||||
|
this.Buttons = Buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
var call = message.GetData<CallbackData>();
|
||||||
|
|
||||||
|
message.Handled = true;
|
||||||
|
|
||||||
|
if (!message.IsAction)
|
||||||
|
return;
|
||||||
|
|
||||||
|
await message.ConfirmAction();
|
||||||
|
|
||||||
|
await message.DeleteMessage();
|
||||||
|
|
||||||
|
var buttons = this.Buttons.Aggregate((a, b) => a.Union(b).ToArray()).ToList();
|
||||||
|
|
||||||
|
if(call==null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
ButtonBase button = buttons.FirstOrDefault(a => a.Value == call.Value);
|
||||||
|
|
||||||
|
if (button == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnButtonClicked(new ButtonClickedEventArgs(button));
|
||||||
|
|
||||||
|
FormBase fb = ButtonForms.ContainsKey(call.Value) ? ButtonForms[call.Value] : null;
|
||||||
|
|
||||||
|
if (fb != null)
|
||||||
|
{
|
||||||
|
await this.NavigateTo(fb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
ButtonForm btn = new ButtonForm();
|
||||||
|
|
||||||
|
foreach(var bl in this.Buttons)
|
||||||
|
{
|
||||||
|
btn.AddButtonRow(bl.Select(a => new ButtonBase(a.Text, CallbackData.Create("action", a.Value))).ToList());
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.Device.Send(this.Message, btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public event EventHandler<ButtonClickedEventArgs> ButtonClicked
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evButtonClicked, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evButtonClicked, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnButtonClicked(ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evButtonClicked] as EventHandler<ButtonClickedEventArgs>)?.Invoke(this, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
103
TelegramBotBase/Form/AutoCleanForm.cs
Normal file
103
TelegramBotBase/Form/AutoCleanForm.cs
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class AutoCleanForm : FormBase
|
||||||
|
{
|
||||||
|
List<Message> OldMessages { get; set; }
|
||||||
|
|
||||||
|
public eDeleteMode DeleteMode { get; set; }
|
||||||
|
|
||||||
|
public enum eDeleteMode
|
||||||
|
{
|
||||||
|
OnEveryCall = 0,
|
||||||
|
OnLeavingForm = 1
|
||||||
|
}
|
||||||
|
|
||||||
|
public AutoCleanForm()
|
||||||
|
{
|
||||||
|
this.OldMessages = new List<Message>();
|
||||||
|
this.DeleteMode = eDeleteMode.OnEveryCall;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Init(params object[] args)
|
||||||
|
{
|
||||||
|
if (this.Device == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.Device.MessageSent += Device_MessageSent;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Device_MessageSent(object sender, MessageSentEventArgs e)
|
||||||
|
{
|
||||||
|
this.OldMessages.Add(e.Message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task PreLoad(MessageResult message)
|
||||||
|
{
|
||||||
|
if (this.DeleteMode != eDeleteMode.OnEveryCall)
|
||||||
|
return;
|
||||||
|
|
||||||
|
while (this.OldMessages.Count > 0)
|
||||||
|
{
|
||||||
|
if (!await this.Device.DeleteMessage(this.OldMessages[0].MessageId))
|
||||||
|
{
|
||||||
|
//Nachricht konnte nicht gelöscht werden, vermutlich existiert diese nicht mehr
|
||||||
|
if (this.OldMessages.Count > 0)
|
||||||
|
this.OldMessages.RemoveAt(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fügt eine Nachricht zu der Liste der löschenden hinzu.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Id"></param>
|
||||||
|
public void AddMessage(Message m)
|
||||||
|
{
|
||||||
|
this.OldMessages.Add(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Behält die Nachricht mit der angegebenen Id.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="Id"></param>
|
||||||
|
public void LeaveMessage(int Id)
|
||||||
|
{
|
||||||
|
var m = this.OldMessages.FirstOrDefault(a => a.MessageId == Id);
|
||||||
|
if (m == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.OldMessages.Remove(m);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Behält die zuletzt gesendete Nachricht.
|
||||||
|
/// </summary>
|
||||||
|
public void LeaveLastMessage()
|
||||||
|
{
|
||||||
|
if (this.OldMessages.Count == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.OldMessages.RemoveAt(this.OldMessages.Count - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async override Task Closed()
|
||||||
|
{
|
||||||
|
if (this.DeleteMode != eDeleteMode.OnLeavingForm)
|
||||||
|
return;
|
||||||
|
|
||||||
|
foreach (var m in this.OldMessages)
|
||||||
|
{
|
||||||
|
await this.Device.DeleteMessage(m.MessageId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
27
TelegramBotBase/Form/ButtonBase.cs
Normal file
27
TelegramBotBase/Form/ButtonBase.cs
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class ButtonBase
|
||||||
|
{
|
||||||
|
public String Text { get; set; }
|
||||||
|
|
||||||
|
public String Value { get; set; }
|
||||||
|
|
||||||
|
public ButtonBase()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public ButtonBase(String Text, String Value)
|
||||||
|
{
|
||||||
|
this.Text = Text;
|
||||||
|
this.Value = Value;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
81
TelegramBotBase/Form/ButtonForm.cs
Normal file
81
TelegramBotBase/Form/ButtonForm.cs
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types.InlineKeyboardButtons;
|
||||||
|
using Telegram.Bot.Types.ReplyMarkups;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class ButtonForm
|
||||||
|
{
|
||||||
|
List<List<ButtonBase>> Buttons = new List<List<ButtonBase>>();
|
||||||
|
|
||||||
|
public ButtonForm()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddButtonRow(List<ButtonBase> row)
|
||||||
|
{
|
||||||
|
Buttons.Add(row);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void AddButtonRow(params ButtonBase[] row)
|
||||||
|
{
|
||||||
|
AddButtonRow(row.ToList());
|
||||||
|
}
|
||||||
|
|
||||||
|
public static T[][] SplitTo<T>(IEnumerable<T> items, int itemsPerRow = 2)
|
||||||
|
{
|
||||||
|
T[][] splitted = default(T[][]);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var t = items.Select((a, index) => new { a, index })
|
||||||
|
.GroupBy(a => a.index / itemsPerRow)
|
||||||
|
.Select(a => a.Select(b => b.a).ToArray()).ToArray();
|
||||||
|
|
||||||
|
splitted = t;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return splitted;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Fügt die Buttons automatisch aufgesplittet in Spalten ein.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="buttons"></param>
|
||||||
|
/// <param name="buttonsPerRow"></param>
|
||||||
|
public void AddSplitted(IEnumerable<ButtonBase> buttons, int buttonsPerRow = 2)
|
||||||
|
{
|
||||||
|
var sp = SplitTo<ButtonBase>(buttons, buttonsPerRow);
|
||||||
|
|
||||||
|
foreach(var bl in sp)
|
||||||
|
{
|
||||||
|
AddButtonRow(bl);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public InlineKeyboardButton[][] ToArray()
|
||||||
|
{
|
||||||
|
var ikb = this.Buttons.Select(a => a.Select(b => InlineKeyboardButton.WithCallbackData(b.Text, b.Value)).ToArray()).ToArray();
|
||||||
|
|
||||||
|
return ikb;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static implicit operator InlineKeyboardMarkup(ButtonForm form)
|
||||||
|
{
|
||||||
|
InlineKeyboardMarkup ikm = new InlineKeyboardMarkup();
|
||||||
|
|
||||||
|
ikm.InlineKeyboard = form.ToArray();
|
||||||
|
|
||||||
|
return ikm;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
66
TelegramBotBase/Form/CallbackData.cs
Normal file
66
TelegramBotBase/Form/CallbackData.cs
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class CallbackData
|
||||||
|
{
|
||||||
|
public String Method { get; set; }
|
||||||
|
|
||||||
|
public String Value { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public CallbackData()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public CallbackData(String method, String value)
|
||||||
|
{
|
||||||
|
this.Method = method;
|
||||||
|
this.Value = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String Create(String method, String value)
|
||||||
|
{
|
||||||
|
return new CallbackData(method, value).Serialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String Serialize()
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
try
|
||||||
|
{
|
||||||
|
|
||||||
|
s = Newtonsoft.Json.JsonConvert.SerializeObject(this);
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CallbackData Deserialize(String data)
|
||||||
|
{
|
||||||
|
CallbackData cd = null;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
cd = Newtonsoft.Json.JsonConvert.DeserializeObject<CallbackData>(data);
|
||||||
|
|
||||||
|
return cd;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
126
TelegramBotBase/Form/FormBase.cs
Normal file
126
TelegramBotBase/Form/FormBase.cs
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class FormBase : IDisposable
|
||||||
|
{
|
||||||
|
public DeviceSession Device { get; set; }
|
||||||
|
|
||||||
|
public MessageClient Client { get; set; }
|
||||||
|
|
||||||
|
public bool CustomEventManagement { get; set; } = false;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gibt an, dass das Formular gewechselt wurde, es werden keine weiteren Events ausgeführt
|
||||||
|
/// </summary>
|
||||||
|
public bool FormSwitched { get; set; } = false;
|
||||||
|
|
||||||
|
public FormBase()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public FormBase(MessageClient Client)
|
||||||
|
{
|
||||||
|
this.Client = Client;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Wird nur aufgerufen, beim erstmaligen Laden des Formulares.
|
||||||
|
/// </summary>
|
||||||
|
public virtual async Task Init(params object[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task Opened()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task Closed()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task PreLoad(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task Load(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public virtual async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
///// <summary>
|
||||||
|
///// Navigiert zur neuen Form.
|
||||||
|
///// </summary>
|
||||||
|
///// <param name="newForm"></param>
|
||||||
|
///// <returns></returns>
|
||||||
|
//public async Task NavigateTo(FormBase newForm)
|
||||||
|
//{
|
||||||
|
// DeviceSession ds = this.Device;
|
||||||
|
// if (ds == null)
|
||||||
|
// return;
|
||||||
|
|
||||||
|
// this.FormSwitched = true;
|
||||||
|
|
||||||
|
// ds.ActiveForm = newForm;
|
||||||
|
// newForm.Client = this.Client;
|
||||||
|
// newForm.Device = ds;
|
||||||
|
|
||||||
|
// await this.Closed();
|
||||||
|
|
||||||
|
// await newForm.Opened();
|
||||||
|
//}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Navigiert zur neuen Form.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="newForm"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task NavigateTo(FormBase newForm, params object[] args)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.Device;
|
||||||
|
if (ds == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
this.FormSwitched = true;
|
||||||
|
|
||||||
|
ds.ActiveForm = newForm;
|
||||||
|
newForm.Client = this.Client;
|
||||||
|
newForm.Device = ds;
|
||||||
|
|
||||||
|
await newForm.Init(args);
|
||||||
|
|
||||||
|
await this.Closed();
|
||||||
|
|
||||||
|
await newForm.Opened();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Dispose()
|
||||||
|
{
|
||||||
|
this.Client = null;
|
||||||
|
this.Device = null;
|
||||||
|
this.FormSwitched = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
102
TelegramBotBase/Form/PromptDialog.cs
Normal file
102
TelegramBotBase/Form/PromptDialog.cs
Normal file
@ -0,0 +1,102 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Form
|
||||||
|
{
|
||||||
|
public class PromptDialog : FormBase
|
||||||
|
{
|
||||||
|
public String Message { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public List<ButtonBase> Buttons { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<String, FormBase> ButtonForms { get; set; } = new Dictionary<string, FormBase>();
|
||||||
|
|
||||||
|
private EventHandlerList __Events { get; set; } = new EventHandlerList();
|
||||||
|
|
||||||
|
private static object __evButtonClicked { get; } = new object();
|
||||||
|
|
||||||
|
public PromptDialog()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public PromptDialog(String Message)
|
||||||
|
{
|
||||||
|
this.Message = Message;
|
||||||
|
this.Buttons = new List<Form.ButtonBase>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public PromptDialog(String Message, params ButtonBase[] Buttons)
|
||||||
|
{
|
||||||
|
this.Message = Message;
|
||||||
|
this.Buttons = Buttons.ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
var call = message.GetData<CallbackData>();
|
||||||
|
if (call == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
message.Handled = true;
|
||||||
|
|
||||||
|
await message.ConfirmAction();
|
||||||
|
|
||||||
|
await message.DeleteMessage();
|
||||||
|
|
||||||
|
|
||||||
|
ButtonBase button = this.Buttons.FirstOrDefault(a => a.Value == call.Value);
|
||||||
|
|
||||||
|
if (button == null)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OnButtonClicked(new ButtonClickedEventArgs(button));
|
||||||
|
|
||||||
|
FormBase fb = ButtonForms.ContainsKey(call.Value) ? ButtonForms[call.Value] : null;
|
||||||
|
|
||||||
|
if (fb != null)
|
||||||
|
{
|
||||||
|
await this.NavigateTo(fb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
ButtonForm btn = new ButtonForm();
|
||||||
|
|
||||||
|
|
||||||
|
var buttons = this.Buttons.Select(a => new ButtonBase(a.Text, CallbackData.Create("action", a.Value))).ToList();
|
||||||
|
btn.AddButtonRow(buttons);
|
||||||
|
|
||||||
|
await this.Device.Send(this.Message, btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public event EventHandler<ButtonClickedEventArgs> ButtonClicked
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evButtonClicked, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evButtonClicked, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void OnButtonClicked(ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evButtonClicked] as EventHandler<ButtonClickedEventArgs>)?.Invoke(this, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
36
TelegramBotBase/Properties/AssemblyInfo.cs
Normal file
36
TelegramBotBase/Properties/AssemblyInfo.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
// die einer Assembly zugeordnet sind.
|
||||||
|
[assembly: AssemblyTitle("TelegramBotBase")]
|
||||||
|
[assembly: AssemblyDescription("")]
|
||||||
|
[assembly: AssemblyConfiguration("")]
|
||||||
|
[assembly: AssemblyCompany("")]
|
||||||
|
[assembly: AssemblyProduct("TelegramBotBase")]
|
||||||
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
|
[assembly: AssemblyTrademark("")]
|
||||||
|
[assembly: AssemblyCulture("")]
|
||||||
|
|
||||||
|
// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar
|
||||||
|
// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von
|
||||||
|
// COM aus zugreifen müssen, sollten Sie das ComVisible-Attribut für diesen Typ auf "True" festlegen.
|
||||||
|
[assembly: ComVisible(false)]
|
||||||
|
|
||||||
|
// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird
|
||||||
|
[assembly: Guid("a61eda27-cfdf-4bcb-b2d6-184f94904f2d")]
|
||||||
|
|
||||||
|
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
|
||||||
|
//
|
||||||
|
// Hauptversion
|
||||||
|
// Nebenversion
|
||||||
|
// Buildnummer
|
||||||
|
// Revision
|
||||||
|
//
|
||||||
|
// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern
|
||||||
|
// übernehmen, indem Sie "*" eingeben:
|
||||||
|
// [assembly: AssemblyVersion("1.0.*")]
|
||||||
|
[assembly: AssemblyVersion("1.0.0.0")]
|
||||||
|
[assembly: AssemblyFileVersion("1.0.0.0")]
|
||||||
71
TelegramBotBase/SessionBase.cs
Normal file
71
TelegramBotBase/SessionBase.cs
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
namespace TelegramBotBase
|
||||||
|
{
|
||||||
|
public class SessionBase
|
||||||
|
{
|
||||||
|
public MessageClient Client { get; set; }
|
||||||
|
|
||||||
|
public Dictionary<long, DeviceSession> SessionList { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
public SessionBase()
|
||||||
|
{
|
||||||
|
this.SessionList = new Dictionary<long, DeviceSession>();
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceSession this[long key]
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.SessionList[key];
|
||||||
|
}
|
||||||
|
set
|
||||||
|
{
|
||||||
|
this.SessionList[key] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceSession GetSession(long deviceId)
|
||||||
|
{
|
||||||
|
DeviceSession ds = this.SessionList.FirstOrDefault(a => a.Key == deviceId).Value ?? null;
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<DeviceSession> StartSession<T>(long deviceId)
|
||||||
|
where T : FormBase
|
||||||
|
{
|
||||||
|
T start = typeof(T).GetConstructor(new Type[] { }).Invoke(new object[] { }) as T;
|
||||||
|
|
||||||
|
start.Client = this.Client;
|
||||||
|
|
||||||
|
DeviceSession ds = new Sessions.DeviceSession(deviceId, start);
|
||||||
|
|
||||||
|
start.Device = ds;
|
||||||
|
await start.Init();
|
||||||
|
|
||||||
|
await start.Opened();
|
||||||
|
|
||||||
|
this[deviceId] = ds;
|
||||||
|
return ds;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void EndSession(long deviceId)
|
||||||
|
{
|
||||||
|
var d = this[deviceId];
|
||||||
|
if (d != null)
|
||||||
|
{
|
||||||
|
this.SessionList.Remove(deviceId);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
270
TelegramBotBase/Sessions/DeviceSession.cs
Normal file
270
TelegramBotBase/Sessions/DeviceSession.cs
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using Telegram.Bot.Types.Enums;
|
||||||
|
using Telegram.Bot.Types.ReplyMarkups;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Sessions
|
||||||
|
{
|
||||||
|
public class DeviceSession
|
||||||
|
{
|
||||||
|
public long DeviceId { get; set; }
|
||||||
|
|
||||||
|
public DateTime LastAction { get; set; }
|
||||||
|
|
||||||
|
public FormBase ActiveForm { get; set; }
|
||||||
|
|
||||||
|
public int LastMessage { get; set; }
|
||||||
|
|
||||||
|
private MessageClient Client
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.ActiveForm.Client;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public EventHandlerList __Events = new EventHandlerList();
|
||||||
|
|
||||||
|
private static object __evMessageSent = new object();
|
||||||
|
|
||||||
|
public DeviceSession()
|
||||||
|
{
|
||||||
|
this.LastMessage = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceSession(long DeviceId)
|
||||||
|
{
|
||||||
|
this.DeviceId = DeviceId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public DeviceSession(long DeviceId, FormBase StartForm)
|
||||||
|
{
|
||||||
|
this.DeviceId = DeviceId;
|
||||||
|
this.ActiveForm = StartForm;
|
||||||
|
this.ActiveForm.Device = this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Bearbeitet die bestehende Text-Nachricht.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messageId"></param>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <param name="buttons"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task Edit(int messageId, String text, ButtonForm buttons = null)
|
||||||
|
{
|
||||||
|
if (this.ActiveForm == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InlineKeyboardMarkup markup = null;
|
||||||
|
if (buttons != null)
|
||||||
|
{
|
||||||
|
markup = buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = await this.Client.TelegramClient.EditMessageTextAsync(this.DeviceId, messageId, text, replyMarkup: markup);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet eine einfache Text-Nachricht.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task Send(String text, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
if (this.ActiveForm == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InlineKeyboardMarkup markup = null;
|
||||||
|
if (buttons != null)
|
||||||
|
{
|
||||||
|
markup = buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = await (this.Client.TelegramClient.SendTextMessageAsync(this.DeviceId, text, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification));
|
||||||
|
|
||||||
|
OnMessageSent(new MessageSentEventArgs(message.MessageId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet eine einfache Text-Nachricht.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="text"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task Send(String text, InlineKeyboardMarkup markup , int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
if (this.ActiveForm == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var message = await (this.Client.TelegramClient.SendTextMessageAsync(this.DeviceId, text, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification));
|
||||||
|
|
||||||
|
OnMessageSent(new MessageSentEventArgs(message.MessageId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet ein Bild
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="file"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendPhoto(FileToSend file, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
if (this.ActiveForm == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
InlineKeyboardMarkup markup = null;
|
||||||
|
if (buttons != null)
|
||||||
|
{
|
||||||
|
markup = buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = await this.Client.TelegramClient.SendPhotoAsync(this.DeviceId, file, replyToMessageId: replyTo, replyMarkup: markup, disableNotification: disableNotification);
|
||||||
|
|
||||||
|
OnMessageSent(new MessageSentEventArgs(message.MessageId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet ein Bild
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="image"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendPhoto(Image image, String name, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
using (var fileStream = Tools.Images.ToStream(image, ImageFormat.Png))
|
||||||
|
{
|
||||||
|
var fts = new FileToSend(name, fileStream);
|
||||||
|
|
||||||
|
await SendPhoto(fts, buttons, replyTo, disableNotification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet ein Bild
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="image"></param>
|
||||||
|
/// <param name="name"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendPhoto(Bitmap image, String name, ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
using (var fileStream = Tools.Images.ToStream(image, ImageFormat.Png))
|
||||||
|
{
|
||||||
|
var fts = new FileToSend(name, fileStream);
|
||||||
|
|
||||||
|
await SendPhoto(fts, buttons, replyTo, disableNotification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet ein Dokument
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="filename"></param>
|
||||||
|
/// <param name="document"></param>
|
||||||
|
/// <param name="caption"></param>
|
||||||
|
/// <param name="buttons"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendDocument(String filename, byte[] document, String caption = "", ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
MemoryStream ms = new MemoryStream(document);
|
||||||
|
|
||||||
|
FileToSend fts = new FileToSend(filename, ms);
|
||||||
|
|
||||||
|
await SendDocument(fts, caption, buttons, replyTo, disableNotification);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Sendet ein Dokument
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="document"></param>
|
||||||
|
/// <param name="caption"></param>
|
||||||
|
/// <param name="buttons"></param>
|
||||||
|
/// <param name="replyTo"></param>
|
||||||
|
/// <param name="disableNotification"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SendDocument(FileToSend document, String caption = "", ButtonForm buttons = null, int replyTo = 0, bool disableNotification = false)
|
||||||
|
{
|
||||||
|
InlineKeyboardMarkup markup = null;
|
||||||
|
if (buttons != null)
|
||||||
|
{
|
||||||
|
markup = buttons;
|
||||||
|
}
|
||||||
|
|
||||||
|
var message = await this.Client.TelegramClient.SendDocumentAsync(this.DeviceId, document, caption, replyMarkup: markup, disableNotification: disableNotification, replyToMessageId: replyTo);
|
||||||
|
|
||||||
|
OnMessageSent(new MessageSentEventArgs(message.MessageId, message));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Legt eine Chat Aktion Fest (Wird angezeigt)
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="action"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public async Task SetAction(ChatAction action)
|
||||||
|
{
|
||||||
|
await this.Client.TelegramClient.SendChatActionAsync(this.DeviceId, action);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Löscht die aktuelle Nachricht, oder die übergebene
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="messageId"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public virtual async Task<bool> DeleteMessage(int messageId = -1)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await this.Client.TelegramClient.DeleteMessageAsync(this.DeviceId, messageId);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public event EventHandler<MessageSentEventArgs> MessageSent
|
||||||
|
{
|
||||||
|
add
|
||||||
|
{
|
||||||
|
this.__Events.AddHandler(__evMessageSent, value);
|
||||||
|
}
|
||||||
|
remove
|
||||||
|
{
|
||||||
|
this.__Events.RemoveHandler(__evMessageSent, value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void OnMessageSent(MessageSentEventArgs e)
|
||||||
|
{
|
||||||
|
(this.__Events[__evMessageSent] as EventHandler<MessageSentEventArgs>)?.Invoke(this, e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
96
TelegramBotBase/TelegramBotBase.csproj
Normal file
96
TelegramBotBase/TelegramBotBase.csproj
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="14.0" DefaultTargets="Build" 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>{A61EDA27-CFDF-4BCB-B2D6-184F94904F2D}</ProjectGuid>
|
||||||
|
<OutputType>Library</OutputType>
|
||||||
|
<AppDesignerFolder>Properties</AppDesignerFolder>
|
||||||
|
<RootNamespace>TelegramBotBase</RootNamespace>
|
||||||
|
<AssemblyName>TelegramBotBase</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<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' ">
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="Newtonsoft.Json, Version=10.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Newtonsoft.Json.10.0.3\lib\net45\Newtonsoft.Json.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.ComponentModel.Composition" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Drawing" />
|
||||||
|
<Reference Include="System.IO.Compression" />
|
||||||
|
<Reference Include="System.Numerics" />
|
||||||
|
<Reference Include="System.Runtime.InteropServices.RuntimeInformation, Version=4.0.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
<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=13.2.1.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\packages\Telegram.Bot.13.2.1\lib\netstandard1.1\Telegram.Bot.dll</HintPath>
|
||||||
|
<Private>True</Private>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="Base\ActionResult.cs" />
|
||||||
|
<Compile Include="Base\ButtonClickedEventArgs.cs" />
|
||||||
|
<Compile Include="Base\MessageClient.cs" />
|
||||||
|
<Compile Include="Base\MessageResult.cs" />
|
||||||
|
<Compile Include="Base\MessageSentEventArgs.cs" />
|
||||||
|
<Compile Include="Base\ResultBase.cs" />
|
||||||
|
<Compile Include="Base\SessionBeginResult.cs" />
|
||||||
|
<Compile Include="Base\SystemExceptionEventArgs.cs" />
|
||||||
|
<Compile Include="Base\UnhandledCallEventArgs.cs" />
|
||||||
|
<Compile Include="Base\SystemCallEventArgs.cs" />
|
||||||
|
<Compile Include="BotBase.cs" />
|
||||||
|
<Compile Include="Form\AlertDialog.cs" />
|
||||||
|
<Compile Include="Form\ArrayPromptDialog.cs" />
|
||||||
|
<Compile Include="Form\AutoCleanForm.cs" />
|
||||||
|
<Compile Include="Form\ButtonBase.cs" />
|
||||||
|
<Compile Include="Form\ButtonForm.cs" />
|
||||||
|
<Compile Include="Form\FormBase.cs" />
|
||||||
|
<Compile Include="Form\CallbackData.cs" />
|
||||||
|
<Compile Include="Form\PromptDialog.cs" />
|
||||||
|
<Compile Include="Tests\TestForm.cs" />
|
||||||
|
<Compile Include="SessionBase.cs" />
|
||||||
|
<Compile Include="Sessions\DeviceSession.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
<Compile Include="Tests\TestForm2.cs" />
|
||||||
|
<Compile Include="Tools\Images.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="packages.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||||
|
Other similar extension points exist, see Microsoft.Common.targets.
|
||||||
|
<Target Name="BeforeBuild">
|
||||||
|
</Target>
|
||||||
|
<Target Name="AfterBuild">
|
||||||
|
</Target>
|
||||||
|
-->
|
||||||
|
</Project>
|
||||||
83
TelegramBotBase/Tests/TestForm.cs
Normal file
83
TelegramBotBase/Tests/TestForm.cs
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Tests
|
||||||
|
{
|
||||||
|
public class TestForm : FormBase
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
String LastMessage { get; set; }
|
||||||
|
|
||||||
|
public override async Task Init(params object[] param)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Opened()
|
||||||
|
{
|
||||||
|
await this.Device.Send("Willkommen in Formular 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Closed()
|
||||||
|
{
|
||||||
|
await this.Device.Send("Tschüss in Formular 1");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Load(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
switch (message.Command)
|
||||||
|
{
|
||||||
|
case "reply":
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "navigate":
|
||||||
|
|
||||||
|
var tf = new TestForm2();
|
||||||
|
|
||||||
|
await tf.Init();
|
||||||
|
|
||||||
|
await this.NavigateTo(tf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
this.LastMessage = message.RawMessageData.Message.Text;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
if (message.Command == "reply")
|
||||||
|
{
|
||||||
|
|
||||||
|
await this.Device.Send("Letzte Nachricht: " + this.LastMessage);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
111
TelegramBotBase/Tests/TestForm2.cs
Normal file
111
TelegramBotBase/Tests/TestForm2.cs
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using Telegram.Bot.Types.InlineKeyboardButtons;
|
||||||
|
using Telegram.Bot.Types.ReplyMarkups;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Tests
|
||||||
|
{
|
||||||
|
public class TestForm2 : FormBase
|
||||||
|
{
|
||||||
|
|
||||||
|
public override async Task Init(params object[] param)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Opened()
|
||||||
|
{
|
||||||
|
await this.Device.Send("Willkommen in Formular 2");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Closed()
|
||||||
|
{
|
||||||
|
await this.Device.Send("Tschüss in Formular 2");
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Load(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
var call = message.GetData<CallbackData>();
|
||||||
|
|
||||||
|
await message.ConfirmAction();
|
||||||
|
|
||||||
|
await message.DeleteMessage();
|
||||||
|
|
||||||
|
if (call.Value == "testform1")
|
||||||
|
{
|
||||||
|
|
||||||
|
var tf = new TestForm();
|
||||||
|
|
||||||
|
await tf.Init();
|
||||||
|
|
||||||
|
await this.NavigateTo(tf);
|
||||||
|
}
|
||||||
|
else if (call.Value == "alert")
|
||||||
|
{
|
||||||
|
var fto = new TestForm2();
|
||||||
|
await fto.Init();
|
||||||
|
|
||||||
|
AlertDialog ad = new AlertDialog("Dies ist eine Meldung !", "Ok", fto);
|
||||||
|
|
||||||
|
|
||||||
|
await this.NavigateTo(ad);
|
||||||
|
}
|
||||||
|
else if (call.Value == "prompt")
|
||||||
|
{
|
||||||
|
PromptDialog pd = new PromptDialog("Bitte bestätigen !", new ButtonBase("Ok", "ok"), new ButtonBase("Abbrechen", "cancel"));
|
||||||
|
|
||||||
|
var tf = new TestForm2();
|
||||||
|
|
||||||
|
await tf.Init();
|
||||||
|
|
||||||
|
pd.ButtonForms.Add("ok", tf);
|
||||||
|
pd.ButtonForms.Add("cancel", tf);
|
||||||
|
|
||||||
|
await this.NavigateTo(pd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
Bitmap bmp = new Bitmap(800, 600);
|
||||||
|
using (Graphics g = Graphics.FromImage(bmp))
|
||||||
|
{
|
||||||
|
|
||||||
|
g.FillRectangle(Brushes.White, 0, 0, bmp.Width, bmp.Height);
|
||||||
|
|
||||||
|
g.DrawString("Testbild", new Font("Arial", 24, FontStyle.Bold, GraphicsUnit.Pixel), Brushes.Black, new PointF(50, 50));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
await this.Device.SetAction(Telegram.Bot.Types.Enums.ChatAction.UploadPhoto);
|
||||||
|
|
||||||
|
ButtonForm 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("Info Dialog", CallbackData.Create("navigate", "alert")), new ButtonBase("Bestätigungs Dialog", CallbackData.Create("navigate", "prompt")));
|
||||||
|
|
||||||
|
|
||||||
|
await this.Device.SendPhoto(bmp, "Test", btn);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
22
TelegramBotBase/Tools/Images.cs
Normal file
22
TelegramBotBase/Tools/Images.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Tools
|
||||||
|
{
|
||||||
|
public static class Images
|
||||||
|
{
|
||||||
|
public static Stream ToStream(this Image image, ImageFormat format)
|
||||||
|
{
|
||||||
|
var stream = new System.IO.MemoryStream();
|
||||||
|
image.Save(stream, format);
|
||||||
|
stream.Position = 0;
|
||||||
|
return stream;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
37
TelegramBotBase/packages.config
Normal file
37
TelegramBotBase/packages.config
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="Microsoft.NETCore.Platforms" version="1.1.0" targetFramework="net452" />
|
||||||
|
<package id="NETStandard.Library" version="1.6.1" targetFramework="net452" />
|
||||||
|
<package id="Newtonsoft.Json" version="10.0.3" targetFramework="net452" />
|
||||||
|
<package id="System.Collections" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Collections.Concurrent" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Diagnostics.Debug" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Diagnostics.Tools" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Diagnostics.Tracing" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Globalization" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.IO" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.IO.Compression" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Linq" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Linq.Expressions" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Net.Http" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Net.Primitives" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.ObjectModel" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Reflection" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Reflection.Extensions" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Reflection.Primitives" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Resources.ResourceManager" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Runtime" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Runtime.Extensions" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Runtime.InteropServices" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Runtime.InteropServices.RuntimeInformation" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Runtime.Numerics" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Text.Encoding" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Text.Encoding.Extensions" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Text.RegularExpressions" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Threading" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Threading.Tasks" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Threading.Timer" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Xml.ReaderWriter" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="System.Xml.XDocument" version="4.3.0" targetFramework="net452" />
|
||||||
|
<package id="Telegram.Bot" version="13.2.1" targetFramework="net452" />
|
||||||
|
</packages>
|
||||||
Loading…
x
Reference in New Issue
Block a user