Compare commits

...
147 Commits
Author SHA1 Message Date
Florian Zevedei cb99ec595c Merge pull request #43 from MajMcCloud/development
Merging development branch to master
2023-08-25 22:41:40 +02:00
Florian Zevedei b10cc30156 Update FUNDING.yml 2023-08-11 15:49:05 +02:00
FlorianDahn da8a2f630b Switching MessageId property from private to public #42 2023-06-04 17:59:55 +02:00
Florian Zevedei f70531dd73 Merge pull request #29 from ZavaruKitsu/development
QoL changes accepted.
2023-06-04 17:30:36 +02:00
Florian Zevedei d7abe6f023 Merge branch 'development' into development 2023-06-04 17:29:28 +02:00
FlorianDahn c463878bb4 Bugfix TaggedButtonGrid max page calculation 2023-06-04 17:17:32 +02:00
FlorianDahn 54513c0214 Moving TaggedButtonGrid icons into localization file 2023-06-04 17:17:15 +02:00
FlorianDahn 6ae92b0b29 Bugfix for TaggedButtonGrid in combination with AutoCleanForm 2023-06-04 17:15:30 +02:00
FlorianDahn cd75275950 Fix in example project 2023-06-04 16:49:15 +02:00
FlorianDahn c0e67d6262 Fixing AutoCleanForm and NavigationController
- AutoCleanForm does not work properly inside a NavigationController (Some messages wont get deleted)
2023-01-27 20:11:45 +01:00
Florian Zevedei 284634d7d1 Update README.md
- changes nuget version icon to "Release" version, not pre-release
2023-01-22 02:25:36 +01:00
Florian Zevedei 34890e35ac Merge pull request #40 from palashjhabak/development
Add Web App Inline Keyboard Button
2023-01-21 17:01:40 +01:00
Florian Zevedei 25019f6c46 Merge pull request #35 from alex6dj/Fix_IDisposable_implementation
Use Dispose pattern in FormBase IDisposable implementation
2023-01-21 16:56:21 +01:00
Palash Jhabak 6343a8a719 Add Web App Inline Keyboard Button 2023-01-21 09:47:28 +05:30
ZavaruKitsu e12e21845f docs(readme): improve grammar 2023-01-04 16:04:36 +03:00
ZavaruKitsu c3c7d8f0c4 Merge remote-tracking branch 'upstream/development' into development
# Conflicts:
#	TelegramBotBase.Test/packages.config
#	TelegramBotBase/Form/CallbackData.cs
#	TelegramBotBase/TelegramBotBase.nuspec
2023-01-04 15:57:29 +03:00
Alexei Agüero Alba 138199e811 Correctly implement Dispose pattern in FormBase for use on derived classes 2022-12-05 17:18:54 -05:00
Florian Zevedei 0d390f30fe Merge pull request #34 from alex6dj/development
Call Serialize implicitly when assigning to a string
2022-12-03 01:27:44 +01:00
Alexei Agüero Alba c86ce7a9e0 Call Serialize implicitly when assigning to a string 2022-12-01 09:45:43 -05:00
Florian Zevedei ec65d609ba Merge pull request #33 from MajMcCloud/master
Updating development with latest changes
2022-11-23 13:17:37 +01:00
Florian Zevedei 355c601e17 Merge pull request #32 from MajMcCloud/development
Updating to 5.2
2022-11-23 13:15:35 +01:00
FlorianDahn 75a70c6ed4 Updating AsyncFormUpdates example 2022-11-23 13:14:17 +01:00
FlorianDahn 8b2d70e016 Update SystemCommandsBot.csproj 2022-11-23 13:12:26 +01:00
FlorianDahn ace936e2e8 Adding images to .github 2022-11-23 13:09:57 +01:00
FlorianDahn 2650144b19 Update README.md 2022-11-23 13:08:22 +01:00
ZavaruKitsu 9400cfc74e refactor: rename MaxLengthException & fix naming 2022-10-15 21:59:12 +03:00
ZavaruKitsu fb51677429 refactor: make properties readonly 2022-10-15 19:01:29 +03:00
ZavaruKitsu a2b75654d8 refactor: example projects 2022-10-15 18:51:26 +03:00
ZavaruKitsu b9a177c152 fix: merge conflict 2022-10-15 18:28:15 +03:00
ZavaruKitsu a0666ad70a fix: merge conflict 2022-10-15 18:24:48 +03:00
ZavaruKitsu 77242a200f upstream: apply changes 2022-10-15 18:16:22 +03:00
FlorianDahnandAlexey dded0ae49e Update Testproject
Co-Authored-By: Alexey <110727638+ZavaruKitsu@users.noreply.github.com>
2022-10-09 17:15:06 +02:00
FlorianDahnandAlexey f39b1d11be Integration of changes
Integrate some changes and cleanups

Co-Authored-By: Alexey <110727638+ZavaruKitsu@users.noreply.github.com>
2022-10-09 17:12:52 +02:00
ZavaruKitsu 8d02b54b05 fix: remove obsolete properties & fix NRE 2022-10-08 20:37:35 +03:00
ZavaruKitsu d566cf858e fix(readme): update docs 2022-10-08 20:01:23 +03:00
ZavaruKitsu f9d25dfb83 fix!: prevent exceptions from being muted
happens by not awaiting tasks
2022-10-08 20:00:21 +03:00
ZavaruKitsu f41fdf90ed fix!: get rid of async void 2022-10-08 19:37:00 +03:00
ZavaruKitsu 5ab15621a0 fix: reformat using C# rules 2022-10-08 19:26:34 +03:00
ZavaruKitsu a731e2a8d0 fix: some build & linter warnings 2022-10-08 19:15:51 +03:00
ZavaruKitsu 3f0d109fe2 fix(readme): missing spaces and semicolon 2022-10-08 18:39:22 +03:00
FlorianDahn 91002c8271 Fix of example descriptions 2022-10-05 16:29:12 +02:00
Florian Zevedei 561312eb87 Merge pull request #28 from ZavaruKitsu/development-readme
docs: better README.md
2022-10-05 16:21:58 +02:00
Florian Zevedei ff21c86ce9 Merge pull request #27 from ZavaruKitsu/development
Accepted! Thanks as always!
2022-09-22 01:18:07 +02:00
ZavaruKitsu 5f9ffb7ae4 docs: fix link 2022-09-22 00:43:02 +03:00
ZavaruKitsu 920284d77d docs: fix anchor 2022-09-22 00:40:39 +03:00
ZavaruKitsu 8ea8e5aa2d docs: make README.md match each one 2022-09-22 00:39:02 +03:00
ZavaruKitsu 7f383a8a83 docs: merge from master/README.md 2022-09-22 00:35:30 +03:00
ZavaruKitsu 0e3cb79a2f docs: fix links to examples 2022-09-22 00:33:07 +03:00
ZavaruKitsu a125addd2e docs: fix anchors 2022-09-22 00:30:14 +03:00
ZavaruKitsu 869d16fa02 docs: better README.md
refactor: move images to the .github folder
2022-09-22 00:30:14 +03:00
ZavaruKitsu 21cdbf4db6 deps: update Telegram.Bot and other libs 2022-09-21 22:49:14 +03:00
FlorianDahn 16371b8c7a #26 Fix error on using InvokeMessageLoop
- Fixes the error on using the default InvokeMessageLoop with Deviceid
2022-09-01 13:49:26 +02:00
Florian Zevedei 601ce32072 Merge pull request #25 from ZavaruKitsu/development
feat: add DI form factory
2022-08-29 18:04:59 +02:00
ZavaruKitsu b2d4c4c3f8 feat: add DI form factory 2022-08-19 15:54:36 +03:00
FlorianDahn 75600d5e7f Update README.md 2022-07-02 14:25:16 +02:00
FlorianDahn df7880fcf3 Make OnMessageSent async as well 2022-07-02 14:07:25 +02:00
FlorianDahn e814046d29 Adding extension folder 2022-07-02 14:06:27 +02:00
FlorianDahn 0ebce16490 Remove unnecessary null checks 2022-07-02 14:05:57 +02:00
FlorianDahn 863b2d0414 Update TelegramBotBase.Extensions.Serializer.Database.MSSQL.csproj 2022-06-30 17:10:48 +02:00
FlorianDahn 436566adeb Update README.md 2022-06-30 16:26:39 +02:00
FlorianDahn 4054fa3e85 Adding new SQL Database serializer 2022-06-30 16:22:53 +02:00
FlorianDahn e8279892e4 Update TelegramBotBase.nuspec
Update Newtonsoft.Json package version
2022-06-27 14:30:23 +02:00
Florian Dahn b32347ff4f Merge pull request #20 from MajMcCloud/dependabot/nuget/Examples/SystemCommandsBot/Newtonsoft.Json-13.0.1
Bump Newtonsoft.Json from 12.0.3 to 13.0.1 in /Examples/SystemCommandsBot
2022-06-23 22:11:38 +02:00
dependabot[bot] b2ffacea2a Bump Newtonsoft.Json in /Examples/SystemCommandsBot
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.3 to 13.0.1.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.1)

---
updated-dependencies:
- dependency-name: Newtonsoft.Json
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 20:11:23 +00:00
Florian Dahn 0d0c2471b2 Merge pull request #22 from MajMcCloud/dependabot/nuget/TelegramBotBase.Test/Newtonsoft.Json-13.0.1
Bump Newtonsoft.Json from 12.0.2 to 13.0.1 in /TelegramBotBase.Test
2022-06-23 22:11:21 +02:00
dependabot[bot] f5054c75d5 Bump Newtonsoft.Json from 12.0.2 to 13.0.1 in /TelegramBotBase.Test
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.2 to 13.0.1.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.2...13.0.1)

---
updated-dependencies:
- dependency-name: Newtonsoft.Json
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 20:11:07 +00:00
Florian Dahn 7a85b2fc31 Merge pull request #21 from MajMcCloud/dependabot/nuget/Examples/AsyncFormUpdates/Newtonsoft.Json-13.0.1
Bump Newtonsoft.Json from 11.0.2 to 13.0.1 in /Examples/AsyncFormUpdates
2022-06-23 22:10:23 +02:00
dependabot[bot] 348909f3ff Bump Newtonsoft.Json from 11.0.2 to 13.0.1 in /Examples/AsyncFormUpdates
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 11.0.2 to 13.0.1.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/11.0.2...13.0.1)

---
updated-dependencies:
- dependency-name: Newtonsoft.Json
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-23 01:00:16 +00:00
FlorianDahn 78b3fbebc8 MessageLoop updates
- moving MessageLoop folders from Subfolder Factories one level up
- changing namespace and botbuilder methods to change
- adding FullMessageLoop which allows to get all updates (like MinimalMessageLoop but with all methods)
2022-06-06 20:16:33 +02:00
Florian Dahn 2a3d8c1b30 Update README.md 2022-05-17 02:29:43 +02:00
FlorianDahn d99bb79849 Shrinking methods to Lambda functions 2022-05-16 14:34:05 +02:00
FlorianDahn 3386db0f66 Updating Test project
- adding "myid" command to get own device id
2022-05-15 23:23:29 +02:00
FlorianDahn 6aac7d887a Update Nuget reference for Polling module to latest version 2022-05-15 23:20:40 +02:00
FlorianDahn 707ffd492f Upgrading BotCommands to new BotCommandScope format
- adding IsKnownBotCommand method to BotBase
- updated UploadBotCommand method to new format
- adding new Commandformat to BotBaseBuilder
- adding AddChatCommand and ClearChatCommand for custom Chat commands
- integrating new checks into FormBaseMessageLoop
2022-05-15 23:20:16 +02:00
FlorianDahn 2c567419ec Update MessageClient.cs
- increasing parameters for Get/SetCommand methods
- adding DeleteBotCommands methods
2022-05-15 23:17:01 +02:00
FlorianDahn e81f535f75 New methods for SendingVideo
- adding SendVideo by byte array
- adding SendLocalVideo to send videofile from disk
2022-05-15 15:42:53 +02:00
FlorianDahn 72a1fa3c99 Replacing Client in ResultBase and subclasses
- replace Client with Device to allow more access
- making Client in DeviceSession public to allow access from outside
2022-05-15 15:41:24 +02:00
FlorianDahn d08cbe8b0e Bugfix with MessageResult leads to having not access to MessageClient 2022-04-16 15:36:55 +02:00
FlorianDahn e2ac7975a5 Updating example projects to .NET 6 and latest framework. 2022-03-19 04:22:07 +01:00
FlorianDahn d7a5c149b1 Replacing BotCommands with BotCommandsScope 2022-02-08 18:07:59 +01:00
FlorianDahn 8fa952e68b Update .gitignore 2022-02-08 17:08:11 +01:00
FlorianDahn a0b87887f7 Merge branch 'development' of https://github.com/MajMcCloud/TelegramBotFramework into development 2022-02-08 17:01:40 +01:00
FlorianDahn f1c626a7ba Integrate new Message Loop 2022-02-08 16:56:35 +01:00
Florian Dahn 46cf9b9f2e Merge pull request #19 from MajMcCloud/master
Update development branch.
2022-02-08 16:35:45 +01:00
Florian Dahn 3340ef7b76 Update README.md 2022-01-10 13:59:26 +01:00
Florian Dahn 211424569b Merge pull request #18 from MajMcCloud/New-Version-v5
New version v5
2022-01-10 13:58:50 +01:00
FlorianDahn 8303b0c87f Adding private constructor
- Adding private constructor
- some spacing for regions
2022-01-06 16:54:50 +01:00
FlorianDahn 19856ab044 Update Solution File 2022-01-06 15:56:16 +01:00
FlorianDahn 5453add956 Renaming TelegramBotBaseTest -> TelegramBotBase.Test 2022-01-06 15:53:41 +01:00
FlorianDahn ff3c22566a Comment Cleanup 2022-01-05 18:40:44 +01:00
FlorianDahn 50fd5255c8 Adding SourceLink to Image Extension 2022-01-05 18:39:35 +01:00
FlorianDahn 4f85677deb Comment Cleanup 2022-01-05 18:39:06 +01:00
FlorianDahn 7d2703138c Readme fix to "generics" like in earlier versions. 2022-01-05 18:31:30 +01:00
FlorianDahn d0d93a07c0 Adding QuickStart to readme. 2022-01-05 18:30:25 +01:00
FlorianDahn f03e67f345 Adding QuickStart Option for BotBaseBuilder 2022-01-05 18:26:10 +01:00
FlorianDahn 18bb6584f4 Adding OnlyStart BotBaseBuilder command option 2022-01-05 18:25:33 +01:00
FlorianDahn d5a89a4ed8 Adding regions to BotBaseBuilder 2022-01-05 18:25:04 +01:00
FlorianDahn 09d7164385 Update README.md 2022-01-05 14:22:21 +01:00
FlorianDahn 2b914f6f58 Changing CustomMessageLoop parameter 2022-01-05 01:17:44 +02:00
FlorianDahn b65ec13d8b Simplifying BotBuilder BotCommands
- Simplifying BotBuilder BotCommands
- updating test project
2022-01-05 01:16:22 +02:00
FlorianDahn ca1c382924 Removing old commented stuff 2022-01-04 23:44:43 +02:00
FlorianDahn 584bb76e0f Adding comments 2022-01-04 23:42:13 +02:00
FlorianDahn c5fa153d54 Replace KickChatMemberAsync/KickUser 2022-01-04 23:40:33 +02:00
FlorianDahn c6106f17ec Removing .Net 4.7.2 and adding .Net Standard 2.0 instead of 2.1
- removing .Net 4.7.2 compilation target
- changing .Net Standard from 2.1 to 2.0 for backwards compatibility
2021-12-25 17:52:17 +01:00
FlorianDahn 4f97e2a919 Changing debugtype to portable to allow snupkg file to be attached. 2021-12-25 17:47:11 +01:00
FlorianDahn 21c6b2fde5 removing .NET 472 compilation target from test project 2021-12-25 17:34:47 +01:00
FlorianDahn caf9b3cc8e Change version of polling library to 1.0.1 2021-12-25 17:34:20 +01:00
FlorianDahn 27e45b397d Changing debugtype to portable to allow snupkg file to be attached.
- removing double Releae config in project settings
- change debugtype to portable to allow correct snupkg package upload
2021-12-25 17:32:21 +01:00
FlorianDahn b8bdc756d4 Rename file to class name 2021-12-25 16:13:31 +01:00
FlorianDahn e5d8e403a0 Update readme with new BotBaseBuilder 2021-12-25 16:12:26 +01:00
FlorianDahn 2c58f86524 Adding localization selection step to BotBaseBuilder
- Adding localization step
- Updating test project
2021-12-25 16:10:32 +01:00
Florian Dahn 4bd43de0fe Update README.md 2021-12-22 15:40:14 +01:00
Florian Dahn 871d25b95b Create README.md 2021-12-22 15:38:46 +01:00
Florian Dahn b508a7e3ce Update README.md 2021-12-20 14:16:28 +01:00
Florian Dahn 0ebba5e204 Update README.md 2021-12-20 14:15:52 +01:00
FlorianDahn 1cc0a2bdf7 Ignore Callback queries with original image attached to message, no SentData event 2021-12-19 14:55:23 +01:00
FlorianDahn fc33da0496 Fixing empty message field 2021-12-17 15:15:58 +01:00
FlorianDahn 35045f3aeb Removing Newtonsoft Dependency 2021-12-16 15:08:56 +01:00
FlorianDahn 3b8b24593f Dependency Update
- downgrade NetStandard from 2.1 to 2.0 to allow .NetFramework usage from 4.6.1 to 4.8
- remove .Net Framework 4.7.2 compilation target
- replacing conditioned compilation for .Net Framework with .Net Standard
- removing System.Net.Http dependency (was only necessary for .Net Framework)
2021-12-16 14:57:28 +01:00
FlorianDahn 03565aba98 Replacing Nuget packages with project references 2021-12-06 02:41:55 +01:00
FlorianDahn bbc436d1d6 Merge branch 'New-Version-v5' of https://github.com/MajMcCloud/TelegramBotFramework into New-Version-v5 2021-12-06 02:37:01 +01:00
FlorianDahn 4026f9ba4e Update for easier serialization during BotBaseBuilder 2021-12-06 02:36:59 +01:00
Florian Dahn fb38d32e9e Update README.md 2021-11-29 15:57:49 +01:00
FlorianDahn 077bd1384f Removing System.ComponentModel dependency 2021-11-28 23:58:23 +01:00
FlorianDahn e28663138b Integrating Images Project 2021-11-28 23:20:56 +01:00
FlorianDahn 65ec7f1c2b Update TelegramBotBase.csproj 2021-11-26 17:59:58 +01:00
FlorianDahn 1fc581b959 V17 - Testproject Update 2021-11-26 17:58:49 +01:00
FlorianDahn 31e52887ba V17 - Big Update
- Adding a message loop interface to build custom message loops
- extracting default message loop from BotBase into seperate class
- updates to BotBaseBuilder for integration of custom message loops
- updating all result classes for using the new Update object of V17
- improving MessageResult and UpdateResult classes
- BotBase has been prepared for cleanup (a lot of comments)
- Comment cleanup at the next build
- updating Readme
2021-11-26 17:57:49 +01:00
FlorianDahn e9c25ea9e4 New ConfirmAction method 2021-11-26 17:49:33 +01:00
FlorianDahn 2aee486370 V17 - Replacing default enum values 2021-11-26 17:49:17 +01:00
FlorianDahn c1a0b12a94 Replace Configure with CustomCommands 2021-11-26 17:47:42 +01:00
FlorianDahn 2bd4634624 V17 - Remove default selection for enums 2021-11-26 17:45:24 +01:00
FlorianDahn 0bc77ca79c Update README.md 2021-11-26 17:43:38 +01:00
FlorianDahn d0edf8531c Replacing Configure method in BBB with CustomCommands 2021-11-22 22:07:55 +01:00
FlorianDahn b001d5e9c4 Adding LambdaStartFormFactory 2021-10-17 18:38:35 +02:00
FlorianDahn e1d5051288 Update README.md 2021-10-17 18:31:28 +02:00
FlorianDahn d00c5e1799 Updating BotBaseBuilder with more functionality 2021-10-17 18:21:05 +02:00
FlorianDahn c4a31e987b Replacing BotBase instance with BotBaseBuilder 2021-10-17 18:07:53 +02:00
Florian Dahn eafb81bf7b Merge pull request #17 from MajMcCloud/master
PR for master changes branch
2021-10-17 17:35:13 +02:00
FlorianDahn 1dff9d5ffe Update IAPIKeySelectionStage.cs 2021-10-17 17:33:49 +02:00
FlorianDahn 755f5a245b Renaming 2021-10-17 17:27:06 +02:00
FlorianDahn a22ede0f4f Changing BotBase behaviour to fluent api
- removing unecessary constructors from BotBase
- removing generics from BotBase
- removing generics from SessionBase
- adding StartFormFactory interface
- adding DefaultStartFormFactory
- adding multiple methods to BotBaseBuilder
2021-10-17 17:25:17 +02:00
FlorianDahn 8e29652148 Fixing possible Deadlock in AutoCleanForm 2021-10-17 15:39:31 +02:00
Florian Dahn 5bb316d874 Merge pull request #15 from victorrar/f/update-readme
Fix documentation inaccuracy

Thanks !
2021-10-04 21:35:59 +02:00
Victor d2ae08771e Fix documentation inaccuracy 2021-10-04 21:55:41 +03:00
Florian Dahn 9162c0894c Merge pull request #14 from MajMcCloud/development
AutoCleanForm FIX
2021-10-01 18:36:24 +02:00
FlorianDahn e0ec133209 AutoCleanForm FIX
- adding MessageDeleted event to AutoCleanForm for catching messages getting deleted outside of AutoCleanForm
- added OnMessageDelete invoke to DeleteMessage in DeviceSession
2021-10-01 18:35:05 +02:00
261 changed files with 14917 additions and 14609 deletions
+1 -1
View File
@@ -1,2 +1,2 @@
github: #[MajMcCloud] github: #[MajMcCloud]
custom: ["https://paypal.me/majmccloud", dahn.partners] custom: ["https://paypal.me/majmccloud"]

Before

Width:  |  Height:  |  Size: 7.0 KiB

After

Width:  |  Height:  |  Size: 7.0 KiB

Before

Width:  |  Height:  |  Size: 784 KiB

After

Width:  |  Height:  |  Size: 784 KiB

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before

Width:  |  Height:  |  Size: 307 KiB

After

Width:  |  Height:  |  Size: 307 KiB

Before

Width:  |  Height:  |  Size: 1.0 MiB

After

Width:  |  Height:  |  Size: 1.0 MiB

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before

Width:  |  Height:  |  Size: 5.3 KiB

After

Width:  |  Height:  |  Size: 5.3 KiB

Before

Width:  |  Height:  |  Size: 10 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 6.9 KiB

Before

Width:  |  Height:  |  Size: 7.9 KiB

After

Width:  |  Height:  |  Size: 7.9 KiB

Before

Width:  |  Height:  |  Size: 8.4 KiB

After

Width:  |  Height:  |  Size: 8.4 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before

Width:  |  Height:  |  Size: 328 KiB

After

Width:  |  Height:  |  Size: 328 KiB

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.6 KiB

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

Before

Width:  |  Height:  |  Size: 756 KiB

After

Width:  |  Height:  |  Size: 756 KiB

Before

Width:  |  Height:  |  Size: 185 KiB

After

Width:  |  Height:  |  Size: 185 KiB

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

Before

Width:  |  Height:  |  Size: 6.6 KiB

After

Width:  |  Height:  |  Size: 6.6 KiB

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 5.7 KiB

+5
View File
@@ -252,3 +252,8 @@ TelegramBotBase/Archive
/TelegramBotBase/TelegramBotBase.1.5.2.zip /TelegramBotBase/TelegramBotBase.1.5.2.zip
/TelegramBotBase/cpush.ps1 /TelegramBotBase/cpush.ps1
/TelegramBotBase/cpack.ps1 /TelegramBotBase/cpack.ps1
*.ps1
*.exe
*.snupkg
*.zip
*.nuspec
-6
View File
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
</startup>
</configuration>
@@ -1,69 +1,14 @@
<?xml version="1.0" encoding="utf-8"?> <Project Sdk="Microsoft.NET.Sdk">
<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>
<PropertyGroup> <OutputType>Exe</OutputType>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> <TargetFramework>net6.0</TargetFramework>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> <ImplicitUsings>enable</ImplicitUsings>
<ProjectGuid>{673A56F5-6110-4AED-A68D-562FD6ED3EA6}</ProjectGuid> <Nullable>disable</Nullable>
<OutputType>Exe</OutputType> </PropertyGroup>
<RootNamespace>AsyncFormUpdates</RootNamespace>
<AssemblyName>AsyncFormUpdates</AssemblyName> <ItemGroup>
<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion> <ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj"/>
<FileAlignment>512</FileAlignment> </ItemGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
</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="Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
<HintPath>..\..\packages\Newtonsoft.Json.11.0.2\lib\net45\Newtonsoft.Json.dll</HintPath>
</Reference>
<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=15.7.1.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\packages\Telegram.Bot.15.7.1\lib\net45\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" />
<None Include="packages.config" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj">
<Project>{0bd16fb9-7ed4-4ccb-83eb-5cee538e1b6c}</Project>
<Name>TelegramBotBase</Name>
</ProjectReference>
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project> </Project>
@@ -0,0 +1,48 @@
using TelegramBotBase.Attributes;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.Forms;
public class AsyncFormEdit : FormBase
{
[SaveState] private int _counter;
private int _messageId;
public override Task Load(MessageResult message)
{
_counter++;
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
switch (message.RawData ?? "")
{
case "back":
var st = new Start();
await NavigateTo(st);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Back", "back");
if (_messageId != 0)
{
await Device.Edit(_messageId, $"Your current count is at: {_counter}", bf);
}
else
{
var m = await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
_messageId = m.MessageId;
}
}
}
@@ -0,0 +1,38 @@
using TelegramBotBase.Attributes;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.Forms;
public class AsyncFormUpdate : AutoCleanForm
{
[SaveState] private int _counter;
public override Task Load(MessageResult message)
{
_counter++;
return Task.CompletedTask;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
switch (message.RawData ?? "")
{
case "back":
var st = new Start();
await NavigateTo(st);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Back", "back");
await Device.Send($"Your current count is at: {_counter}", bf, disableNotification: true);
}
}
+42
View File
@@ -0,0 +1,42 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.Forms;
public class Start : AutoCleanForm
{
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
switch (message.RawData ?? "")
{
case "async":
var afe = new AsyncFormEdit();
await NavigateTo(afe);
break;
case "async_del":
var afu = new AsyncFormUpdate();
await NavigateTo(afu);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Open Async Form with AutoCleanupForm", "async_del");
bf.AddButtonRow("Open Async Form with Edit", "async");
await Device.Send("Choose your option", bf);
}
}
+36 -37
View File
@@ -1,48 +1,47 @@
using System; using System.Timers;
using System.Collections.Generic; using AsyncFormUpdates.Forms;
using System.Linq; using TelegramBotBase;
using System.Text; using TelegramBotBase.Builder;
using System.Threading.Tasks; using Timer = System.Timers.Timer;
using System.Timers;
namespace AsyncFormUpdates namespace AsyncFormUpdates;
internal class Program
{ {
class Program private static BotBase __bot;
private static async Task Main(string[] args)
{ {
static TelegramBotBase.BotBase<forms.Start> bot = null; __bot = BotBaseBuilder.Create()
.QuickStart<Start>(Environment.GetEnvironmentVariable("API_KEY") ??
throw new Exception("API_KEY is not set"))
.Build();
static void Main(string[] args) await __bot.Start();
var timer = new Timer(5000);
timer.Elapsed += Timer_Elapsed;
timer.Start();
Console.ReadLine();
timer.Stop();
await __bot.Stop();
}
private static async void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach (var s in __bot.Sessions.SessionList)
{ {
String apiKey = "APIKey"; //Only for AsyncUpdateForm
if (s.Value.ActiveForm.GetType() != typeof(AsyncFormUpdate) &&
bot = new TelegramBotBase.BotBase<forms.Start>(apiKey); s.Value.ActiveForm.GetType() != typeof(AsyncFormEdit))
bot.Start();
var timer = new Timer(5000);
timer.Elapsed += Timer_Elapsed;
timer.Start();
Console.ReadLine();
timer.Stop();
bot.Stop();
}
private static async void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
foreach(var s in bot.Sessions.SessionList)
{ {
//Only for AsyncUpdateForm continue;
if (s.Value.ActiveForm.GetType() != typeof(forms.AsyncFormUpdate) && s.Value.ActiveForm.GetType() != typeof(forms.AsyncFormEdit))
continue;
await bot.InvokeMessageLoop(s.Key);
} }
await __bot.InvokeMessageLoop(s.Key);
} }
} }
} }
@@ -1,36 +0,0 @@
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("AsyncFormUpdates")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AsyncFormUpdates")]
[assembly: AssemblyCopyright("Copyright © 2021")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Durch Festlegen von ComVisible auf FALSE werden die Typen in dieser Assembly
// für COM-Komponenten unsichtbar. 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("673a56f5-6110-4aed-a68d-562fd6ed3ea6")]
// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten:
//
// Hauptversion
// Nebenversion
// Buildnummer
// Revision
//
// Sie können alle Werte angeben oder Standardwerte für die Build- und Revisionsnummern verwenden,
// indem Sie "*" wie unten gezeigt eingeben:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
@@ -1,57 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Attributes;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.forms
{
public class AsyncFormEdit : FormBase
{
[SaveState]
int counter = 0;
int MessageId = 0;
public override async Task Load(MessageResult message)
{
counter++;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction("");
switch (message.RawData ?? "")
{
case "back":
var st = new Start();
await NavigateTo(st);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Back", "back");
if (MessageId != 0)
{
await Device.Edit(MessageId, $"Your current count is at: {counter}", bf);
}
else
{
var m = await Device.Send($"Your current count is at: {counter}", bf, disableNotification: true);
MessageId = m.MessageId;
}
}
}
}
@@ -1,48 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Attributes;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.forms
{
public class AsyncFormUpdate : AutoCleanForm
{
[SaveState]
int counter = 0;
public override async Task Load(MessageResult message)
{
counter++;
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction("");
switch (message.RawData ?? "")
{
case "back":
var st = new Start();
await NavigateTo(st);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Back", "back");
await Device.Send($"Your current count is at: {counter}", bf, disableNotification: true);
}
}
}
-52
View File
@@ -1,52 +0,0 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace AsyncFormUpdates.forms
{
public class Start : AutoCleanForm
{
public override async Task Action(MessageResult message)
{
await message.ConfirmAction("");
switch (message.RawData ?? "")
{
case "async":
var afe = new AsyncFormEdit();
await NavigateTo(afe);
break;
case "async_del":
var afu = new AsyncFormUpdate();
await NavigateTo(afu);
break;
}
}
public override async Task Render(MessageResult message)
{
var bf = new ButtonForm();
bf.AddButtonRow("Open Async Form with AutoCleanupForm", "async_del");
bf.AddButtonRow("Open Async Form with Edit", "async");
await Device.Send("Choose your option", bf);
}
}
}
@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="Newtonsoft.Json" version="11.0.2" targetFramework="net472" />
<package id="System.Net.Requests" version="4.3.0" targetFramework="net472" />
<package id="Telegram.Bot" version="15.7.1" targetFramework="net472" />
</packages>
@@ -0,0 +1,12 @@
using Microsoft.EntityFrameworkCore;
namespace EFCoreBot.Database;
public class BotDbContext : DbContext
{
public BotDbContext(DbContextOptions options) : base(options)
{
}
public DbSet<User> Users { get; set; }
}
+7
View File
@@ -0,0 +1,7 @@
namespace EFCoreBot.Database;
public class User
{
public long Id { get; set; }
public string LastMessage { get; set; }
}
+19
View File
@@ -0,0 +1,19 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="6.0.9"/>
<PackageReference Include="Microsoft.EntityFrameworkCore.InMemory" Version="6.0.9"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj"/>
</ItemGroup>
</Project>
+24
View File
@@ -0,0 +1,24 @@
using EFCoreBot;
using EFCoreBot.Database;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using TelegramBotBase.Builder;
var serviceCollection = new ServiceCollection()
.AddDbContext<BotDbContext>(x => x.UseInMemoryDatabase("TelegramBotBase"));
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();
await bot.Start();
await Task.Delay(-1);
+36
View File
@@ -0,0 +1,36 @@
using EFCoreBot.Database;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace EFCoreBot;
public class StartForm : FormBase
{
private readonly BotDbContext _dbContext;
public StartForm(BotDbContext dbContext)
{
_dbContext = dbContext;
}
public override async Task Load(MessageResult message)
{
var user = await _dbContext.Users.FindAsync(Device.DeviceId);
if (user is null)
{
user = new User
{
Id = Device.DeviceId,
LastMessage = "<unknown>"
};
_dbContext.Users.Add(user);
await _dbContext.SaveChangesAsync();
}
await Device.Send($"Your last message's text was: `{user.LastMessage}`");
user.LastMessage = string.IsNullOrWhiteSpace(message.MessageText) ? "<unknown>" : message.MessageText;
await _dbContext.SaveChangesAsync();
}
}
@@ -0,0 +1,21 @@
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Args;
using TelegramBotBase.Form;
namespace JoinHiderBot.Forms;
public class GroupManageForm : GroupForm
{
public override async Task OnMemberChanges(MemberChangeEventArgs e)
{
if (e.Type != MessageType.ChatMembersAdded && e.Type != MessageType.ChatMemberLeft)
{
return;
}
var m = e.Result.Message;
await Device.DeleteMessage(m);
}
}
+23
View File
@@ -0,0 +1,23 @@
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace JoinHiderBot.Forms;
public class Start : SplitterForm
{
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;
}
}
+9 -7
View File
@@ -1,12 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net6.0</TargetFramework>
</PropertyGroup> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="TelegramBotBase" Version="3.1.1" /> <ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>
+12 -12
View File
@@ -1,19 +1,19 @@
using System; using JoinHiderBot.Forms;
using TelegramBotBase.Builder;
namespace JoinHiderBot namespace JoinHiderBot;
internal class Program
{ {
class Program private static async Task Main(string[] args)
{ {
static void Main(string[] args) var bot = BotBaseBuilder.Create()
{ .QuickStart<Start>(Environment.GetEnvironmentVariable("API_KEY") ??
throw new Exception("API_KEY is not set"))
.Build();
String apiKey = ""; await bot.Start();
var bot = new TelegramBotBase.BotBase<forms.Start>(apiKey); Console.ReadLine();
bot.Start();
Console.ReadLine();
}
} }
} }
@@ -1,25 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Form;
namespace JoinHiderBot.forms
{
public class GroupManageForm : GroupForm
{
public override async Task OnMemberChanges(MemberChangeEventArgs e)
{
if (e.Type != Telegram.Bot.Types.Enums.MessageType.ChatMembersAdded && e.Type != Telegram.Bot.Types.Enums.MessageType.ChatMemberLeft)
return;
var m = e.Result.Message;
await this.Device.DeleteMessage(m);
}
}
}
-29
View File
@@ -1,29 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace JoinHiderBot.forms
{
public class Start : SplitterForm
{
public override async Task<bool> Open(MessageResult e)
{
await this.Device.Send("This bot works only in groups.");
return true;
}
public override async Task<bool> OpenGroup(MessageResult e)
{
var gmf = new GroupManageForm();
await this.NavigateTo(gmf);
return true;
}
}
}
+21
View File
@@ -0,0 +1,21 @@
namespace SystemCommandsBot;
public class Command
{
public int Id { get; set; }
public string Title { get; set; }
public string ShellCmd { get; set; }
public bool Enabled { get; set; } = true;
public string Action { get; set; }
public bool UseShell { get; set; } = true;
public int? MaxInstances { get; set; }
public string ProcName { get; set; }
}
+90
View File
@@ -0,0 +1,90 @@
using Newtonsoft.Json;
namespace SystemCommandsBot;
public class Config
{
public Config()
{
Commands = new List<Command>();
}
public string Password { get; set; }
public string ApiKey { get; set; }
public List<Command> Commands { get; set; }
public void LoadDefaultValues()
{
ApiKey = "";
Commands.Add(new Command
{
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);
}
return null;
}
public static Config Load(string path)
{
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
{
}
}
}
+156
View File
@@ -0,0 +1,156 @@
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace SystemCommandsBot.Forms;
public class CmdForm : AutoCleanForm
{
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.Commands.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.Commands.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);
}
}
}
@@ -0,0 +1,38 @@
using System;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace SystemCommandsBot.Forms;
public class StartForm : FormBase
{
public string Password { get; set; }
public override Task Load(MessageResult message)
{
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);
}
}
+25 -26
View File
@@ -1,36 +1,35 @@
using System; using System;
using System.Threading.Tasks;
using SystemCommandsBot.Forms;
using TelegramBotBase.Builder;
namespace SystemCommandsBot namespace SystemCommandsBot;
internal class Program
{ {
class Program public static Config BotConfig { get; set; }
private static async Task Main(string[] args)
{ {
public static config.Config BotConfig { get; set; } BotConfig = Config.Load();
if (BotConfig.ApiKey == null || BotConfig.ApiKey.Trim() == "")
static void Main(string[] args)
{ {
Console.WriteLine("Config created...");
BotConfig = config.Config.load();
if (BotConfig.ApiKey == null || BotConfig.ApiKey.Trim() == "")
{
Console.WriteLine("Config created...");
Console.ReadLine();
return;
}
var bot = new TelegramBotBase.BotBase<forms.StartForm>(BotConfig.ApiKey);
bot.Start();
Console.WriteLine("Bot started");
Console.ReadLine(); Console.ReadLine();
return;
bot.Stop();
} }
var bot = BotBaseBuilder.Create()
.QuickStart<StartForm>(BotConfig.ApiKey)
.Build();
await bot.Start();
Console.WriteLine("Bot started");
Console.ReadLine();
await bot.Stop();
} }
} }
@@ -1,13 +1,14 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>netcoreapp3.1</TargetFramework> <TargetFramework>net6.0</TargetFramework>
</PropertyGroup> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="12.0.3" /> <ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj"/>
<PackageReference Include="TelegramBotBase" Version="3.1.1" /> </ItemGroup>
</ItemGroup>
</Project> </Project>
@@ -1,30 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace SystemCommandsBot.commands
{
public class Commando
{
public int ID { get; set; }
public String Title { get; set; }
public String ShellCmd { get; set; }
public bool Enabled { get; set; } = true;
public String Action { get; set; }
public bool UseShell { get; set; } = true;
public int? MaxInstances { get; set; }
public String ProcName
{
get;set;
}
}
}
@@ -1,92 +0,0 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace SystemCommandsBot.config
{
public class Config
{
public String Password { get; set; }
public String ApiKey { get; set; }
public List<commands.Commando> Commandos { get; set; }
public Config()
{
this.Commandos = new List<commands.Commando>();
}
public void loadDefaultValues()
{
this.ApiKey = "";
this.Commandos.Add(new commands.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);
}
return null;
}
public static Config load(String path)
{
try
{
var cfg = Newtonsoft.Json.JsonConvert.DeserializeObject<Config>(File.ReadAllText(path)) as Config;
return cfg;
}
catch (DirectoryNotFoundException ex)
{
DirectoryInfo 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 ex)
{
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, Newtonsoft.Json.JsonConvert.SerializeObject(this));
}
catch
{
}
}
}
}
-172
View File
@@ -1,172 +0,0 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace SystemCommandsBot.forms
{
public class CmdForm : TelegramBotBase.Form.AutoCleanForm
{
public DateTime ExpiresAt { get; set; }
public int? MessageId { get; set; }
public override async Task Load(MessageResult message)
{
}
public override async Task Action(MessageResult message)
{
var btn = message.RawData;
int 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 this.Device.Send("Cmd nicht verfügbar.");
return;
}
message.Handled = true;
switch (cmd.Action)
{
case "start":
FileInfo fi = new FileInfo(cmd.ShellCmd);
if (cmd.MaxInstances != null && cmd.MaxInstances >= 0)
{
if (Process.GetProcessesByName(cmd.ProcName).Count() >= cmd.MaxInstances)
{
await this.Device.Send("Anwendung läuft bereits.");
await message.ConfirmAction("Anwendung läuft bereits.");
return;
}
}
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = cmd.ShellCmd;
psi.WorkingDirectory = fi.DirectoryName;
psi.UseShellExecute = cmd.UseShell;
Process.Start(psi);
await this.Device.Send(fi.Name + " wurde gestarted.");
await message.ConfirmAction(fi.Name + " wurde gestarted.");
break;
case "kill":
FileInfo fi2 = new FileInfo(cmd.ShellCmd);
String pros = fi2.Name.Replace(fi2.Extension, "");
var proc = Process.GetProcessesByName(pros).ToList();
foreach (var p in proc)
{
try
{
p.Kill();
}
catch
{
}
}
await this.Device.Send(fi2.Name + " wurde beendet.");
await message.ConfirmAction(fi2.Name + " wurde beendet.");
break;
case "restart":
FileInfo fi3 = new FileInfo(cmd.ShellCmd);
String pros2 = fi3.Name.Replace(fi3.Extension, "");
var proc2 = Process.GetProcessesByName(pros2).ToList();
foreach (var p in proc2)
{
try
{
p.Kill();
}
catch
{
}
}
FileInfo fi4 = new FileInfo(cmd.ShellCmd);
ProcessStartInfo psi2 = new ProcessStartInfo();
psi2.FileName = cmd.ShellCmd;
psi2.WorkingDirectory = fi4.DirectoryName;
psi2.FileName = cmd.ShellCmd;
psi2.UseShellExecute = cmd.UseShell;
Process.Start(psi2);
await this.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 (this.MessageId == null)
{
var buttons = Program.BotConfig.Commandos.Where(a => a.Enabled).Select(a => new ButtonBase(a.Title, a.ID.ToString()));
ButtonForm bf = new ButtonForm();
bf.AddSplitted(buttons, 1);
await this.Device.Send("Deine Optionen", bf);
return;
}
}
}
}
@@ -1,42 +0,0 @@
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
using TelegramBotBase.Base;
namespace SystemCommandsBot.forms
{
public class StartForm : TelegramBotBase.Form.FormBase
{
public String Password { get; set; }
public override async Task Load(MessageResult message)
{
var inp = message.MessageText;
if (Program.BotConfig.Password == inp)
{
this.Password = inp;
}
}
public override async Task Render(MessageResult message)
{
if (this.Password == null || this.Password.Trim() == "")
{
await this.Device.Send("Bitte gib dein Passwort an.");
return;
}
var cmd = new forms.CmdForm();
cmd.ExpiresAt = DateTime.Now.AddDays(14);
await this.NavigateTo(cmd);
}
}
}
+635 -787
View File
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,64 @@
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Threading.Tasks;
using Telegram.Bot.Types;
using Telegram.Bot.Types.InputFiles;
using TelegramBotBase.Form;
using TelegramBotBase.Sessions;
namespace TelegramBotBase.Extensions.Images
{
public static class ImageExtensions
{
public static Stream ToStream(this Image image, ImageFormat format)
{
var stream = new MemoryStream();
image.Save(stream, format);
stream.Position = 0;
return stream;
}
/// <summary>
/// Sends an image
/// </summary>
/// <param name="image"></param>
/// <param name="name"></param>
/// <param name="buttons"></param>
/// <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)
{
using (var fileStream = ToStream(image, ImageFormat.Png))
{
var fts = new InputOnlineFile(fileStream, name);
return await session.SendPhoto(fts, caption, buttons, replyTo, disableNotification);
}
}
/// <summary>
/// Sends an image
/// </summary>
/// <param name="image"></param>
/// <param name="name"></param>
/// <param name="buttons"></param>
/// <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)
{
using (var fileStream = ToStream(image, ImageFormat.Png))
{
var fts = new InputOnlineFile(fileStream, name);
return await session.SendPhoto(fts, caption, buttons, replyTo, disableNotification);
}
}
}
}
@@ -0,0 +1,7 @@
# TelegramBotBase.Extensions.Images
[![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/v/TelegramBotBase.Extensions.Images.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images/)
[![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase)
[![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
[![Package Downloads](https://img.shields.io/nuget/dt/TelegramBotBase.Extensions.Images.svg?style=flat-square&label=Package%20Downloads)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images)
@@ -0,0 +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>
<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>
</Project>
@@ -0,0 +1,82 @@
using System;
using TelegramBotBase.Builder;
using TelegramBotBase.Builder.Interfaces;
namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
{
public static class BotBaseBuilderExtensions
{
/// <summary>
/// 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_")
{
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
builder.UseSerialization(serializer);
return builder as BotBaseBuilder;
}
/// <summary>
/// Uses an Microsoft SQL Server Database to save and restore sessions.
/// </summary>
/// <param name="builder"></param>
/// <param name="hostOrIP"></param>
/// <param name="userId"></param>
/// <param name="password"></param>
/// <param name="databaseName"></param>
/// <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_")
{
var connectionString =
$"Server={hostOrIP}; Database={databaseName}; User Id={userId}; Password={password}; TrustServerCertificate=true;";
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
builder.UseSerialization(serializer);
return builder as BotBaseBuilder;
}
/// <summary>
/// Uses an Microsoft SQL Server Database with Windows Authentication to save and restore sessions.
/// </summary>
/// <param name="builder"></param>
/// <param name="hostOrIP"></param>
/// <param name="databaseName"></param>
/// <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_")
{
if (!integratedSecurity)
{
throw new ArgumentOutOfRangeException();
}
var connectionString =
$"Server={hostOrIP}; Database={databaseName}; Integrated Security=true; TrustServerCertificate=true;";
var serializer = new MssqlSerializer(connectionString, tablePrefix, fallbackForm);
builder.UseSerialization(serializer);
return builder as BotBaseBuilder;
}
}
}
@@ -0,0 +1,183 @@
using System;
using System.Data;
using Microsoft.Data.SqlClient;
using Newtonsoft.Json;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
using TelegramBotBase.Interfaces;
namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
{
public class MssqlSerializer : IStateMachine
{
/// <summary>
/// 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="overwrite">Declares of the file could be overwritten.</param>
public MssqlSerializer(string connectionString, string tablePrefix = "tgb_", Type fallbackStateForm = null)
{
ConnectionString = connectionString ?? throw new ArgumentNullException(nameof(connectionString));
TablePrefix = tablePrefix;
FallbackStateForm = fallbackStateForm;
if (FallbackStateForm != null && !FallbackStateForm.IsSubclassOf(typeof(FormBase)))
{
throw new ArgumentException("FallbackStateForm is not a subclass of FormBase");
}
}
public string ConnectionString { get; }
public string TablePrefix { get; set; }
public Type FallbackStateForm { get; set; }
public StateContainer LoadFormStates()
{
var sc = new StateContainer();
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
var command = connection.CreateCommand();
command.CommandText = "SELECT deviceId, deviceTitle, FormUri, QualifiedName FROM " + TablePrefix +
"devices_sessions";
var dataTable = new DataTable();
using (var dataAdapter = new SqlDataAdapter(command))
{
dataAdapter.Fill(dataTable);
foreach (DataRow r in dataTable.Rows)
{
var se = new StateEntry
{
DeviceId = (long)r["deviceId"],
ChatTitle = r["deviceTitle"].ToString(),
FormUri = r["FormUri"].ToString(),
QualifiedName = r["QualifiedName"].ToString()
};
sc.States.Add(se);
if (se.DeviceId > 0)
{
sc.ChatIds.Add(se.DeviceId);
}
else
{
sc.GroupIds.Add(se.DeviceId);
}
var command2 = connection.CreateCommand();
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();
using (var dataAdapter2 = new SqlDataAdapter(command2))
{
dataAdapter2.Fill(dataTable2);
foreach (DataRow r2 in dataTable2.Rows)
{
var key = r2["key"].ToString();
var type = Type.GetType(r2["type"].ToString());
var value = JsonConvert.DeserializeObject(r2["value"].ToString(), type);
se.Values.Add(key, value);
}
}
}
}
connection.Close();
}
return sc;
}
public void SaveFormStates(SaveStatesEventArgs e)
{
var container = e.States;
using (var connection = new SqlConnection(ConnectionString))
{
connection.Open();
//Cleanup old Session data
var clearCommand = connection.CreateCommand();
clearCommand.CommandText = $"DELETE FROM {TablePrefix}devices_sessions_data";
clearCommand.ExecuteNonQuery();
clearCommand.CommandText = $"DELETE FROM {TablePrefix}devices_sessions";
clearCommand.ExecuteNonQuery();
//Prepare new session commands
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.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.Parameters.Add(new SqlParameter("@deviceId", ""));
dataCommand.Parameters.Add(new SqlParameter("@key", ""));
dataCommand.Parameters.Add(new SqlParameter("@value", ""));
dataCommand.Parameters.Add(new SqlParameter("@type", ""));
//Store session data in database
foreach (var state in container.States)
{
sessionCommand.Parameters["@deviceId"].Value = state.DeviceId;
sessionCommand.Parameters["@deviceTitle"].Value = state.ChatTitle ?? "";
sessionCommand.Parameters["@FormUri"].Value = state.FormUri;
sessionCommand.Parameters["@QualifiedName"].Value = state.QualifiedName;
sessionCommand.ExecuteNonQuery();
foreach (var data in state.Values)
{
dataCommand.Parameters["@deviceId"].Value = state.DeviceId;
dataCommand.Parameters["@key"].Value = data.Key;
var type = data.Value.GetType();
if (type.IsPrimitive || type.Equals(typeof(string)))
{
dataCommand.Parameters["@value"].Value = data.Value;
}
else
{
dataCommand.Parameters["@value"].Value = JsonConvert.SerializeObject(data.Value);
}
dataCommand.Parameters["@type"].Value = type.AssemblyQualifiedName;
dataCommand.ExecuteNonQuery();
}
}
connection.Close();
}
}
}
}
@@ -0,0 +1,27 @@
# TelegramBotBase.Extensions.Serializer.Database.MSSQL
[![NuGet version (TelegramBotBase)](https://img.shields.io/nuget/v/TelegramBotBase.Extensions.Serializer.Database.MSSQL.svg?style=flat-square)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL/)
[![Telegram chat](https://img.shields.io/badge/Support_Chat-Telegram-blue.svg?style=flat-square)](https://www.t.me/tgbotbase)
[![License](https://img.shields.io/github/license/MajMcCloud/telegrambotframework.svg?style=flat-square&maxAge=2592000&label=License)](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
[![Package Downloads](https://img.shields.io/nuget/dt/TelegramBotBase.Extensions.Serializer.Database.MSSQL.svg?style=flat-square&label=Package%20Downloads)](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL)
## How to use
```csharp
using TelegramBotBase.Extensions.Serializer.Database.MSSQL;
var bot = BotBaseBuilder
.Create()
.WithAPIKey(APIKey)
.DefaultMessageLoop()
.WithStartForm<Start>()
.NoProxy()
.OnlyStart()
.UseSQLDatabase("localhost", "telegram_bot")
.UseEnglish()
.Build();
bot.Start();
```
@@ -0,0 +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>
<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>
</Project>
@@ -0,0 +1,81 @@
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
(
[
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
(
[
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
+109
View File
@@ -0,0 +1,109 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Builder;
using TelegramBotBase.Commands;
using TelegramBotBase.Enums;
using TelegramBotBase.Example.Tests;
namespace TelegramBotBase.Example;
internal class Program
{
private static async Task Main(string[] args)
{
var bot = BotBaseBuilder
.Create()
.WithAPIKey(Environment.GetEnvironmentVariable("API_KEY") ??
throw new Exception("API_KEY is not set"))
.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();
bot.BotCommand += Bb_BotCommand;
//Update Bot commands to botfather
bot.UploadBotCommands().Wait();
bot.SetSetting(ESettings.LogAllMessages, true);
bot.Message += (s, en) =>
{
Console.WriteLine(en.DeviceId + " " + en.Message.MessageText + " " + (en.Message.RawData ?? ""));
};
await bot.Start();
Console.WriteLine("Telegram Bot started...");
Console.WriteLine("Press q to quit application.");
Console.ReadLine();
await bot.Stop();
}
private static async Task Bb_BotCommand(object sender, BotCommandEventArgs en)
{
switch (en.Command)
{
case "/start":
var start = new Menu();
await en.Device.ActiveForm.NavigateTo(start);
break;
case "/form1":
var form1 = new TestForm();
await en.Device.ActiveForm.NavigateTo(form1);
break;
case "/form2":
var form2 = new TestForm2();
await en.Device.ActiveForm.NavigateTo(form2);
break;
case "/myid":
await en.Device.Send($"Your Device ID is: {en.DeviceId}");
en.Handled = true;
break;
case "/params":
var m = en.Parameters.DefaultIfEmpty("").Aggregate((a, b) => a + " and " + b);
await en.Device.Send("Your parameters are: " + m, replyTo: en.Device.LastMessageId);
en.Handled = true;
break;
}
}
}
@@ -0,0 +1,15 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net6.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>disable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\TelegramBotBase.Extensions.Images\TelegramBotBase.Extensions.Images.csproj" />
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
</ItemGroup>
</Project>
@@ -0,0 +1,94 @@
using System;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests;
public class ButtonTestForm : AutoCleanForm
{
public ButtonTestForm()
{
Opened += ButtonTestForm_Opened;
}
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)
{
return;
}
message.Handled = true;
switch (call.Value)
{
case "button1":
await Device.Send("Button 1 pressed");
break;
case "button2":
await Device.Send("Button 2 pressed");
break;
case "button3":
await Device.Send("Button 3 pressed");
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);
}
}
@@ -0,0 +1,69 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class ButtonGridForm : AutoCleanForm
{
private ButtonGrid _mButtons;
public ButtonGridForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += ButtonGridForm_Init;
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
{
_mButtons = new ButtonGrid
{
KeyboardType = EKeyboardType.InlineKeyBoard
};
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.DataSource.ButtonForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
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}");
}
}
}
@@ -0,0 +1,66 @@
using System.Collections.Generic;
using System.Globalization;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class ButtonGridPagingForm : AutoCleanForm
{
private ButtonGrid _mButtons;
public ButtonGridPagingForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += ButtonGridForm_Init;
}
private Task ButtonGridForm_Init(object sender, InitEventArgs e)
{
_mButtons = new ButtonGrid
{
KeyboardType = EKeyboardType.ReplyKeyboard,
EnablePaging = true,
EnableSearch = 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 ButtonBase(c.EnglishName, c.EnglishName));
}
_mButtons.DataSource.ButtonForm = bf;
_mButtons.ButtonClicked += Bg_ButtonClicked;
AddControl(_mButtons);
return Task.CompletedTask;
}
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
{
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}");
}
}
}
@@ -0,0 +1,74 @@
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.DataSources;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class ButtonGridTagForm : AutoCleanForm
{
private TaggedButtonGrid _mButtons;
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("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}");
}
}
@@ -0,0 +1,69 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class CalendarPickerForm : AutoCleanForm
{
public CalendarPickerForm()
{
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;
}
}
}
@@ -0,0 +1,86 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.DataSources;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class CheckedButtonListForm : AutoCleanForm
{
private CheckedButtonList _mButtons;
public CheckedButtonListForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += CheckedButtonListForm_Init;
}
private Task CheckedButtonListForm_Init(object sender, InitEventArgs e)
{
_mButtons = new CheckedButtonList
{
KeyboardType = EKeyboardType.InlineKeyBoard,
EnablePaging = true,
HeadLayoutButtonRow = new List<ButtonBase> { new("Back", "back"), new("Switch Keyboard", "switch") },
SubHeadLayoutButtonRow = new List<ButtonBase> { new("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;
}
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)
{
return;
}
switch (e.Button.Value)
{
case "back":
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;
}
}
}
@@ -0,0 +1,67 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class MonthPickerForm : AutoCleanForm
{
public MonthPickerForm()
{
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;
}
}
}
@@ -0,0 +1,55 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class MultiToggleButtons : AutoCleanForm
{
public MultiToggleButtons()
{
DeleteMode = EDeleteMode.OnLeavingForm;
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.");
}
}
@@ -0,0 +1,51 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.DataSources;
using TelegramBotBase.Enums;
using TelegramBotBase.Example.Tests.Controls.Subclass;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class MultiViewForm : AutoCleanForm
{
private ButtonGrid _bg;
private MultiViewTest _mvt;
public MultiViewForm()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Init += MultiViewForm_Init;
}
private Task MultiViewForm_Init(object sender, InitEventArgs e)
{
_mvt = new MultiViewTest();
AddControl(_mvt);
_bg = new ButtonGrid
{
DataSource = new ButtonFormDataSource()
};
_bg.DataSource.ButtonForm.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;
}
}
}
@@ -0,0 +1,52 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls.Subclass;
public class MultiViewTest : MultiView
{
public override Task Action(MessageResult result, string value = null)
{
switch (result.RawData)
{
case "back":
SelectedViewIndex--;
break;
case "next":
SelectedViewIndex++;
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;
}
}
}
@@ -0,0 +1,52 @@
using System;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class ToggleButtons : AutoCleanForm
{
public ToggleButtons()
{
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"));
}
}
@@ -0,0 +1,98 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Controls;
public class TreeViewForms : AutoCleanForm
{
public TreeViewForms()
{
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;
}
}
}
+132
View File
@@ -0,0 +1,132 @@
using System.Linq;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Types.Enums;
using Telegram.Bot.Types.InputFiles;
using Telegram.Bot.Types.ReplyMarkups;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests;
public class DataForm : AutoCleanForm
{
public override async Task SentData(DataResult data)
{
var tmp = "";
InputOnlineFile file;
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";
await Device.Send("Your contact: \r\n" + tmp, replyTo: data.MessageId);
break;
case MessageType.Document:
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded document");
break;
case MessageType.Video:
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded video");
break;
case MessageType.Audio:
file = new InputOnlineFile(data.Document.FileId);
await Device.SendDocument(file, "Your uploaded audio");
break;
case MessageType.Location:
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);
break;
case MessageType.Photo:
var photo = new InputOnlineFile(data.Photos.Last().FileId);
await Device.Send("Your image: ", replyTo: data.MessageId);
await Client.TelegramClient.SendPhotoAsync(Device.DeviceId, photo);
break;
default:
await Device.Send("Unknown response");
break;
}
}
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
if (message.Handled)
{
return;
}
switch (message.RawData)
{
case "contact":
await Device.RequestContact();
break;
case "location":
await Device.RequestLocation();
break;
case "back":
message.Handled = true;
var start = new Menu();
await NavigateTo(start);
break;
}
}
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 location", "location"));
bf.AddButtonRow(new ButtonBase("Back", "back"));
InlineKeyboardMarkup ikv = bf;
await Device.Send("Please upload a contact, photo, video, audio, document or location.", bf);
}
}
@@ -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 TelegramBotBase.Example.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));
}
}
@@ -0,0 +1,51 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Controls.Hybrid;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.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;
}
}
}
@@ -0,0 +1,72 @@
using System;
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Groups;
public class GroupChange : GroupForm
{
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);
}
}
@@ -0,0 +1,165 @@
using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Groups;
public class LinkReplaceTest : GroupForm
{
private const int Maximum = 3;
public LinkReplaceTest()
{
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.BanUser(from);
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName +
" has been removed from the group");
}
else
{
await e.Device.RestrictUser(from, cp, DateTime.UtcNow.AddSeconds(30));
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName +
" has been blocked for 30 seconds");
}
}
/// <summary>
/// Call onmessage also on edited message, if someone want to spoof a failed message and insert a link.
/// </summary>
/// <param name="message"></param>
/// <returns></returns>
public override async Task OnMessageEdit(MessageResult message)
{
await OnMessage(message);
}
/// <summary>
/// https://stackoverflow.com/a/20651284
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
private bool HasLinks(string str)
{
var tmp = str;
var pattern =
@"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&amp;%\$#\=~])*[^\.\,\)\(\s]$";
var r = new Regex(pattern);
var matches = r.Matches(tmp);
return matches.Count > 0;
}
}
@@ -0,0 +1,82 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Groups;
public class WelcomeUser : GroupForm
{
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");
}
}
}
+265
View File
@@ -0,0 +1,265 @@
using System.Threading.Tasks;
using Telegram.Bot.Types.Enums;
using TelegramBotBase.Base;
using TelegramBotBase.Enums;
using TelegramBotBase.Example.Tests.Controls;
using TelegramBotBase.Example.Tests.DataSources;
using TelegramBotBase.Example.Tests.Groups;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests;
public class Menu : AutoCleanForm
{
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))
{
var sf = new WelcomeUser();
await NavigateTo(sf);
}
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;
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);
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);
}
}
@@ -0,0 +1,39 @@
using System;
using System.Threading.Tasks;
using TelegramBotBase.Form;
using TelegramBotBase.Form.Navigation;
namespace TelegramBotBase.Example.Tests.Navigation;
internal class CustomController : NavigationController
{
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();
}
}
@@ -0,0 +1,83 @@
using System;
using System.Threading.Tasks;
using Telegram.Bot.Types;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Navigation;
public class Form1 : FormBase
{
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);
}
}
@@ -0,0 +1,80 @@
using System.Threading.Tasks;
using Telegram.Bot.Types;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Navigation;
public class Start : FormBase
{
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);
}
}
@@ -0,0 +1,61 @@
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Notifications;
public class Start : AutoCleanForm
{
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;
}
}
+136
View File
@@ -0,0 +1,136 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Controls.Inline;
using TelegramBotBase.Enums;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests;
public class ProgressTest : AutoCleanForm
{
public ProgressTest()
{
DeleteMode = EDeleteMode.OnLeavingForm;
Opened += ProgressTest_Opened;
Closed += ProgressTest_Closed;
}
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)
{
return;
}
ProgressBar bar = null;
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;
}
//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);
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");
}
}
@@ -0,0 +1,98 @@
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Register;
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)
{
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)
{
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);
}
}
@@ -0,0 +1,41 @@
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Example.Tests.Register.Steps;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Register;
public class PerStep : AutoCleanForm
{
public override async Task Action(MessageResult message)
{
await message.ConfirmAction();
switch (message.RawData)
{
case "start":
var step1 = new Step1();
await NavigateTo(step1);
break;
case "back":
var start = new 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);
}
}
@@ -0,0 +1,57 @@
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Register;
public class Start : AutoCleanForm
{
public override async Task Action(MessageResult message)
{
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;
}
}
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);
}
}
@@ -0,0 +1,10 @@
namespace TelegramBotBase.Example.Tests.Register.Steps;
public class Data
{
public string EMail { get; set; }
public string Firstname { get; set; }
public string Lastname { get; set; }
}
@@ -0,0 +1,61 @@
using System.Threading.Tasks;
using TelegramBotBase.Args;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Register.Steps;
public class Step1 : AutoCleanForm
{
public Step1()
{
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);
}
}
@@ -0,0 +1,50 @@
using System.Threading.Tasks;
using TelegramBotBase.Base;
using TelegramBotBase.Form;
namespace TelegramBotBase.Example.Tests.Register.Steps;
public class Step2 : AutoCleanForm
{
public Data UserData { get; set; }
public override Task Load(MessageResult message)
{
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 (UserData.Lastname == null)
{
await Device.Send("Please sent your lastname:");
return;
}
message.Handled = true;
var step3 = new Step3();
step3.UserData = UserData;
await NavigateTo(step3);
}
}

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