Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
355c601e17 | ||
|
|
75a70c6ed4 | ||
|
|
8b2d70e016 | ||
|
|
ace936e2e8 | ||
|
|
2650144b19 | ||
|
|
dded0ae49e | ||
|
|
f39b1d11be | ||
|
|
91002c8271 | ||
|
|
561312eb87 | ||
|
|
ff21c86ce9 | ||
|
|
5f9ffb7ae4 | ||
|
|
920284d77d | ||
|
|
8ea8e5aa2d | ||
|
|
7f383a8a83 | ||
|
|
0e3cb79a2f | ||
|
|
a125addd2e | ||
|
|
869d16fa02 | ||
|
|
21cdbf4db6 | ||
|
|
16371b8c7a | ||
|
|
601ce32072 | ||
|
|
b2d4c4c3f8 | ||
|
|
75600d5e7f | ||
|
|
df7880fcf3 | ||
|
|
e814046d29 | ||
|
|
0ebce16490 | ||
|
|
863b2d0414 | ||
|
|
436566adeb | ||
|
|
4054fa3e85 | ||
|
|
e8279892e4 | ||
|
|
b32347ff4f | ||
|
|
b2ffacea2a | ||
|
|
0d0c2471b2 | ||
|
|
f5054c75d5 | ||
|
|
7a85b2fc31 | ||
|
|
348909f3ff | ||
|
|
78b3fbebc8 | ||
|
|
2a3d8c1b30 | ||
|
|
d99bb79849 | ||
|
|
3386db0f66 | ||
|
|
6aac7d887a | ||
|
|
707ffd492f | ||
|
|
2c567419ec | ||
|
|
e81f535f75 | ||
|
|
72a1fa3c99 | ||
|
|
d08cbe8b0e | ||
|
|
e2ac7975a5 | ||
|
|
d7a5c149b1 | ||
|
|
8fa952e68b | ||
|
|
a0b87887f7 | ||
|
|
f1c626a7ba | ||
|
|
46cf9b9f2e | ||
|
|
3340ef7b76 | ||
|
|
211424569b | ||
|
|
8303b0c87f | ||
|
|
19856ab044 | ||
|
|
5453add956 | ||
|
|
ff3c22566a | ||
|
|
50fd5255c8 | ||
|
|
4f85677deb | ||
|
|
7d2703138c | ||
|
|
d0d93a07c0 | ||
|
|
f03e67f345 | ||
|
|
18bb6584f4 | ||
|
|
d5a89a4ed8 | ||
|
|
09d7164385 | ||
|
|
2b914f6f58 | ||
|
|
b65ec13d8b | ||
|
|
ca1c382924 | ||
|
|
584bb76e0f | ||
|
|
c5fa153d54 | ||
|
|
c6106f17ec | ||
|
|
4f97e2a919 | ||
|
|
21c6b2fde5 | ||
|
|
caf9b3cc8e | ||
|
|
27e45b397d | ||
|
|
b8bdc756d4 | ||
|
|
e5d8e403a0 | ||
|
|
2c58f86524 | ||
|
|
4bd43de0fe | ||
|
|
871d25b95b | ||
|
|
b508a7e3ce | ||
|
|
0ebba5e204 | ||
|
|
1cc0a2bdf7 | ||
|
|
fc33da0496 | ||
|
|
35045f3aeb | ||
|
|
3b8b24593f | ||
|
|
03565aba98 | ||
|
|
bbc436d1d6 | ||
|
|
4026f9ba4e | ||
|
|
fb38d32e9e | ||
|
|
077bd1384f | ||
|
|
e28663138b | ||
|
|
65ec7f1c2b | ||
|
|
1fc581b959 | ||
|
|
31e52887ba | ||
|
|
e9c25ea9e4 | ||
|
|
2aee486370 | ||
|
|
c1a0b12a94 | ||
|
|
2bd4634624 | ||
|
|
0bc77ca79c | ||
|
|
d0edf8531c | ||
|
|
b001d5e9c4 | ||
|
|
e1d5051288 | ||
|
|
d00c5e1799 | ||
|
|
c4a31e987b | ||
|
|
eafb81bf7b | ||
|
|
1dff9d5ffe | ||
|
|
755f5a245b | ||
|
|
a22ede0f4f | ||
|
|
8e29652148 | ||
|
|
5bb316d874 | ||
|
|
d2ae08771e | ||
|
|
9162c0894c | ||
|
|
e0ec133209 | ||
|
|
7004ee5963 | ||
|
|
ef8ca3c988 | ||
|
|
f021f12486 | ||
|
|
d06e1eaa52 | ||
|
|
23969881c1 | ||
|
|
9fa3df2889 | ||
|
|
6ed91224eb | ||
|
|
aabc7f04b7 | ||
|
|
71433c0e4e | ||
|
|
894d0799c8 | ||
|
|
6c2543630d | ||
|
|
84d18f6f45 | ||
|
|
5f49e25458 | ||
|
|
f28c9b1e22 | ||
|
|
0db0c00cd0 | ||
|
|
2158f53cde | ||
|
|
fd7d72b986 | ||
|
|
47a5b502b9 | ||
|
|
ce4c7b6f1c | ||
|
|
5bae650edc | ||
|
|
9eae63dae6 | ||
|
|
6f005114bc | ||
|
|
00440a50e8 | ||
|
|
ae9dd17ae3 | ||
|
|
be2660239a | ||
|
|
e88114049e | ||
|
|
177c198916 | ||
|
|
1f7a9900c4 | ||
|
|
d6051ce607 | ||
|
|
5613e84bc3 | ||
|
|
d52fd41467 | ||
|
|
8df6e4ce55 | ||
|
|
9012ec76b1 | ||
|
|
36fb40b6bd | ||
|
|
47aa8c2aaa | ||
|
|
1709631965 | ||
|
|
264a998052 | ||
|
|
a00aaacbfb | ||
|
|
bd908db867 | ||
|
|
e2c485aede | ||
|
|
c8936d0748 | ||
|
|
92f12735c8 | ||
|
|
8142b626b2 | ||
|
|
5dcbe04a73 | ||
|
|
e742ded371 | ||
|
|
706b0f522a | ||
|
|
61e3652edf | ||
|
|
c484edd427 | ||
|
|
181902336c | ||
|
|
dc364b5fd3 | ||
|
|
1fd4752c0e | ||
|
|
d84be50243 | ||
|
|
1caa71cd25 | ||
|
|
e81e5f1854 | ||
|
|
399e056a8f | ||
|
|
26c4f479fa | ||
|
|
72d94df907 | ||
|
|
31e0683699 | ||
|
|
676be49a62 | ||
|
|
5b67f334ff | ||
|
|
6a556af070 | ||
|
|
4910a04923 | ||
|
|
10f4e1b745 | ||
|
|
42b624c28f | ||
|
|
75013d51bd | ||
|
|
7f3bcfe418 | ||
|
|
f5e26924d8 | ||
|
|
884aa60fac | ||
|
|
adc18891e0 | ||
|
|
07eb4bef75 | ||
|
|
dfe64b22ab | ||
|
|
15a8b8897f | ||
|
|
91048b4f7c | ||
|
|
426bb078af | ||
|
|
63deb978a4 | ||
|
|
1a2b5818aa | ||
|
|
fc44b7d38c | ||
|
|
dc8cb81284 | ||
|
|
0202fc29a8 | ||
|
|
7e51126fd3 | ||
|
|
67e82acf20 | ||
|
|
c32fc2c3da | ||
|
|
4351fc7c68 | ||
|
|
80d43ac369 | ||
|
|
376ba68e8e | ||
|
|
6b404545df | ||
|
|
a524fef0d5 | ||
|
|
73ba36ea2b | ||
|
|
46160b54ae | ||
|
|
87690a3630 | ||
|
|
975a942993 | ||
|
|
4336ff1681 | ||
|
|
567a9f937f | ||
|
|
95b4ff77c5 | ||
|
|
ba82c11d66 | ||
|
|
c2e33da277 | ||
|
|
259fa54236 | ||
|
|
f790a16e85 | ||
|
|
97fea333f7 | ||
|
|
e1b31b0b9a | ||
|
|
7aca5a648f | ||
|
|
f24c309f63 | ||
|
|
ba9fd8062c | ||
|
|
b37c31f2bd | ||
|
|
2c34a178ee | ||
|
|
2f030f3c12 | ||
|
|
a364562fd3 | ||
|
|
8ef8733a2b | ||
|
|
049b2081ec | ||
|
|
48b76a84be | ||
|
|
31c8231b2d | ||
|
|
e9504f3b36 | ||
|
|
8592f4279d | ||
|
|
2457773a12 | ||
|
|
46e65faf31 | ||
|
|
193a4811bf | ||
|
|
08a0de8087 | ||
|
|
82469cff70 | ||
|
|
81eafe1219 | ||
|
|
183e89c36f | ||
|
|
ad6cf9539c | ||
|
|
46576eb819 | ||
|
|
cf9e2285f1 | ||
|
|
ecfacdadbb | ||
|
|
c00c2e8d8f | ||
|
|
bfd905d590 | ||
|
|
7b1bf75dde | ||
|
|
7a7a65c3a7 | ||
|
|
8a42a861cf | ||
|
|
47876681e0 | ||
|
|
9314b4c0e5 | ||
|
|
01c19b9900 | ||
|
|
0af587d27f | ||
|
|
97b9176c3a | ||
|
|
dfa479d409 | ||
|
|
07dec0dc9d | ||
|
|
2fc16b18da | ||
|
|
11eeb0dcab | ||
|
|
fbfcbe99fb | ||
|
|
948c1368d7 | ||
|
|
d66df4978d | ||
|
|
7d8895850a | ||
|
|
5e87d00c58 | ||
|
|
efe5fef7d0 | ||
|
|
eebb5cb6f5 | ||
|
|
992065d289 | ||
|
|
1acfeb873f | ||
|
|
de35ebb66e | ||
|
|
2c3e707673 | ||
|
|
6d39d2fb73 | ||
|
|
ef667d12d8 | ||
|
|
d24f8e7ac5 | ||
|
|
e5dc3fd2bc | ||
|
|
6ebb96bd93 | ||
|
|
a1b3b9246b | ||
|
|
25a0ff2e3e | ||
|
|
b74233d66d | ||
|
|
fb7b624ad8 | ||
|
|
965e6e18b9 | ||
|
|
b1c518cbd3 | ||
|
|
ab0ae5cda4 | ||
|
|
b850330f65 | ||
|
|
317dad7d24 | ||
|
|
eb61d40a38 | ||
|
|
2ed030b2fb | ||
|
|
fd6f6fef34 | ||
|
|
54176f9136 | ||
|
|
f80fda8ff9 | ||
|
|
8b66842d34 | ||
|
|
0cdb8c3a1a | ||
|
|
8b9929198a | ||
|
|
7a3e4721bd | ||
|
|
f914920919 | ||
|
|
0435c68281 | ||
|
|
5a1e050aec | ||
|
|
6a62d73fe0 | ||
|
|
519a6fe41c | ||
|
|
201dfd10dd | ||
|
|
78a412c630 | ||
|
|
7a7014cec3 | ||
|
|
64311d0cd9 | ||
|
|
762fb27294 | ||
|
|
164194ac66 | ||
|
|
321bd7c0ff | ||
|
|
37ef30ebee | ||
|
|
9b1461ad78 | ||
|
|
38fa0a4e99 | ||
|
|
fba922049f | ||
|
|
d5a9a5f7a4 | ||
|
|
5126074419 | ||
|
|
aa38492bde | ||
|
|
9c68914e9d | ||
|
|
3fe2779b1e | ||
|
|
8e6de4a0e1 | ||
|
|
382ae2de2d | ||
|
|
77fd3393de | ||
|
|
0f1da77aca | ||
|
|
1561c1dd08 | ||
|
|
5b38f2e1e2 | ||
|
|
2989456fe5 | ||
|
|
7e4174a3be | ||
|
|
73f81cc8a2 | ||
|
|
2071ba2eeb | ||
|
|
a08ba8f512 | ||
|
|
649b94dafe | ||
|
|
7be0f15ca4 | ||
|
|
e29be4f1f4 | ||
|
|
176107300b | ||
|
|
0ceab58059 | ||
|
|
6ebdd9f208 | ||
|
|
595efd2276 | ||
|
|
85a479d826 | ||
|
|
150e9f731d | ||
|
|
0eab45bdbb | ||
|
|
a33cf5b841 | ||
|
|
1f9539a23d | ||
|
|
9cbde4830e | ||
|
|
3bea2783b1 | ||
|
|
038a941d33 | ||
|
|
48c62e57f8 | ||
|
|
b0e6a8b981 | ||
|
|
2e0656dc06 | ||
|
|
d1456d5bd1 | ||
|
|
058539777f | ||
|
|
5c69289198 | ||
|
|
4c8b085655 | ||
|
|
94d22318f8 | ||
|
|
2028e2f9e6 | ||
|
|
394209b303 | ||
|
|
f0fa953819 | ||
|
|
1d44b50883 | ||
|
|
3c21af8f68 | ||
|
|
1b811e1786 | ||
|
|
94195ec5bf | ||
|
|
256cac825f | ||
|
|
69e5a6717b | ||
|
|
a6d22cdd82 | ||
|
|
ee4a3d765c | ||
|
|
703c99eb8d | ||
|
|
138fee9772 | ||
|
|
d60399514f | ||
|
|
ae0fa3b0e3 | ||
|
|
6a2ac7a309 | ||
|
|
1a76b2b3f8 | ||
|
|
5893108bd3 | ||
|
|
d668f57711 | ||
|
|
56c7754408 | ||
|
|
805ffb9ec7 | ||
|
|
aeddd82ea9 | ||
|
|
1ec14ce680 | ||
|
|
3a309baeae | ||
|
|
e02af0fc76 | ||
|
|
530e01f971 | ||
|
|
dcf3cf804f | ||
|
|
a42d3934b5 | ||
|
|
2126b45fed | ||
|
|
b6b9d5b6b1 | ||
|
|
eed5f012dc | ||
|
|
de4cc138ae | ||
|
|
e4da70d37d | ||
|
|
cb4a797b12 | ||
|
|
94d153e141 | ||
|
|
e13cb6d4ef | ||
|
|
c0e285d39e | ||
|
|
8338c5c066 | ||
|
|
52c01b3dfd | ||
|
|
fe1aafc9a5 | ||
|
|
022eee4b57 | ||
|
|
ea971979e2 | ||
|
|
9585a231bd | ||
|
|
c07aca96a4 | ||
|
|
01de9ec932 | ||
|
|
94fe263676 | ||
|
|
4f1eae543d | ||
|
|
1491fc1795 | ||
|
|
b2db44fe4c | ||
|
|
3a78a98b9e | ||
|
|
b14fa2dc87 | ||
|
|
5cd54fc746 | ||
|
|
fb68da6ab1 | ||
|
|
2f7ded8ce5 | ||
|
|
906177a5f9 | ||
|
|
873c91a165 | ||
|
|
46c1acbf99 | ||
|
|
acd06a6948 | ||
|
|
a97305fa35 | ||
|
|
16baef0c45 | ||
|
|
211bc55aff |
@@ -0,0 +1,2 @@
|
|||||||
|
github: #[MajMcCloud]
|
||||||
|
custom: ["https://paypal.me/majmccloud", dahn.partners]
|
||||||
|
After Width: | Height: | Size: 7.0 KiB |
|
After Width: | Height: | Size: 784 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 307 KiB |
|
After Width: | Height: | Size: 1.0 MiB |
|
After Width: | Height: | Size: 7.4 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 6.9 KiB |
|
After Width: | Height: | Size: 7.9 KiB |
|
After Width: | Height: | Size: 8.4 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 9.2 KiB |
|
After Width: | Height: | Size: 12 KiB |
|
After Width: | Height: | Size: 328 KiB |
|
After Width: | Height: | Size: 4.6 KiB |
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 756 KiB |
|
After Width: | Height: | Size: 185 KiB |
|
After Width: | Height: | Size: 2.6 KiB |
|
After Width: | Height: | Size: 6.6 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
@@ -240,3 +240,20 @@ ModelManifest.xml
|
|||||||
|
|
||||||
# FAKE - F# Make
|
# FAKE - F# Make
|
||||||
.fake/
|
.fake/
|
||||||
|
MigrationBackup
|
||||||
|
TelegramBotBase/nuget.exe
|
||||||
|
Material
|
||||||
|
TelegramBotBase/cp.ps1
|
||||||
|
TelegramBotBase/TelegramBotBase.nuspec
|
||||||
|
Program.cs
|
||||||
|
TelegramBotBase/Archive
|
||||||
|
/TelegramBotBase/TelegramBotBase.1.5.0.zip
|
||||||
|
/TelegramBotBase/TelegramBotBase.1.5.1.zip
|
||||||
|
/TelegramBotBase/TelegramBotBase.1.5.2.zip
|
||||||
|
/TelegramBotBase/cpush.ps1
|
||||||
|
/TelegramBotBase/cpack.ps1
|
||||||
|
*.ps1
|
||||||
|
*.exe
|
||||||
|
*.snupkg
|
||||||
|
*.zip
|
||||||
|
*.nuspec
|
||||||
|
|||||||
@@ -0,0 +1,378 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<startup>
|
||||||
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
|
||||||
|
</startup>
|
||||||
|
<runtime>
|
||||||
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-13.0.0.0" newVersion="13.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Microsoft.VisualBasic.Core" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-10.0.6.0" newVersion="10.0.6.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Microsoft.Win32.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="Microsoft.Win32.Registry" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="netstandard" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.Concurrent" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.NonGeneric" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Collections.Specialized" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ComponentModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ComponentModel.EventBasedAsync" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ComponentModel.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ComponentModel.TypeConverter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Console" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Data.Common" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.Contracts" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.Debug" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.FileVersionInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.Process" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.StackTrace" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.4.0" newVersion="4.0.4.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.TextWriterTraceListener" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.TraceSource" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Diagnostics.Tracing" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Drawing.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Compression" publicKeyToken="b77a5c561934e089" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Compression.ZipFile" publicKeyToken="b77a5c561934e089" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.FileSystem" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.FileSystem.DriveInfo" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.FileSystem.Watcher" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.IsolatedStorage" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.MemoryMappedFiles" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.IO.Pipes" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Linq" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Linq.Expressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Linq.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Linq.Queryable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Memory" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.NameResolution" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.NetworkInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Ping" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Requests" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Security" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.ServicePoint" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.Sockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.WebHeaderCollection" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.WebSockets" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Net.WebSockets.Client" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.ObjectModel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Reflection.Emit.ILGeneration" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Reflection.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Resources.ResourceManager" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Resources.Writer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.CompilerServices.VisualC" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.InteropServices" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Numerics" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Serialization.Formatters" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Serialization.Json" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Serialization.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Runtime.Serialization.Xml" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.3.0" newVersion="4.1.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.AccessControl" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Claims" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Algorithms" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.2.2.0" newVersion="4.2.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Csp" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Encoding" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Cryptography.X509Certificates" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.2.0" newVersion="4.1.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Principal" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Security.Principal.Windows" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-6.0.0.0" newVersion="6.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Encoding.Extensions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Encodings.Web" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.Json" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Text.RegularExpressions" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading.Tasks.Parallel" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.1.0" newVersion="4.0.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading.Thread" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Threading.ThreadPool" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.12.0" newVersion="4.0.12.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Transactions.Local" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.ReaderWriter" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.1.1.0" newVersion="4.1.1.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.XmlSerializer" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.11.0" newVersion="4.0.11.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.XPath" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity name="System.Xml.XPath.XDocument" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
|
||||||
|
<bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
|
||||||
|
</dependentAssembly>
|
||||||
|
</assemblyBinding>
|
||||||
|
</runtime>
|
||||||
|
</configuration>
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
||||||
|
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
||||||
|
<ProjectGuid>{673A56F5-6110-4AED-A68D-562FD6ED3EA6}</ProjectGuid>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<RootNamespace>AsyncFormUpdates</RootNamespace>
|
||||||
|
<AssemblyName>AsyncFormUpdates</AssemblyName>
|
||||||
|
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
|
||||||
|
<FileAlignment>512</FileAlignment>
|
||||||
|
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
||||||
|
<Deterministic>true</Deterministic>
|
||||||
|
<TargetFrameworkProfile />
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="mscorlib" />
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Core" />
|
||||||
|
<Reference Include="System.Xml.Linq" />
|
||||||
|
<Reference Include="System.Data.DataSetExtensions" />
|
||||||
|
<Reference Include="Microsoft.CSharp" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Net.Http" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
<Reference Include="Telegram.Bot, Version=17.0.0.0, Culture=neutral, processorArchitecture=MSIL">
|
||||||
|
<HintPath>..\..\packages\Telegram.Bot.17.0.0\lib\netstandard2.0\Telegram.Bot.dll</HintPath>
|
||||||
|
</Reference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Include="forms\AsyncFormEdit.cs" />
|
||||||
|
<Compile Include="forms\AsyncFormUpdate.cs" />
|
||||||
|
<Compile Include="forms\Start.cs" />
|
||||||
|
<Compile Include="Program.cs" />
|
||||||
|
<Compile Include="Properties\AssemblyInfo.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="App.config" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\TelegramBotBase\TelegramBotBase.csproj">
|
||||||
|
<Project>{0bd16fb9-7ed4-4ccb-83eb-5cee538e1b6c}</Project>
|
||||||
|
<Name>TelegramBotBase</Name>
|
||||||
|
</ProjectReference>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
|
<PackageReference Include="System.Net.Requests" Version="4.3.0" />
|
||||||
|
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
|
||||||
|
<PackageReference Include="System.Threading.Tasks.Extensions" Version="4.5.4" />
|
||||||
|
<PackageReference Include="Telegram.Bot" Version="18.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using System.Timers;
|
||||||
|
using TelegramBotBase.Builder;
|
||||||
|
|
||||||
|
namespace AsyncFormUpdates
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static TelegramBotBase.BotBase bot = null;
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
String apiKey = "APIKey";
|
||||||
|
|
||||||
|
bot = BotBaseBuilder.Create()
|
||||||
|
.QuickStart<forms.Start>(apiKey)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
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
|
||||||
|
if (s.Value.ActiveForm.GetType() != typeof(forms.AsyncFormUpdate) && s.Value.ActiveForm.GetType() != typeof(forms.AsyncFormEdit))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
await bot.InvokeMessageLoop(s.Key);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
using System.Reflection;
|
||||||
|
using System.Runtime.CompilerServices;
|
||||||
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
|
// die einer Assembly zugeordnet sind.
|
||||||
|
[assembly: AssemblyTitle("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")]
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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; }
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
namespace EFCoreBot.Database;
|
||||||
|
|
||||||
|
public class User
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string LastMessage { get; set; }
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
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();
|
||||||
|
|
||||||
|
bot.Start();
|
||||||
|
await Task.Delay(-1);
|
||||||
@@ -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,12 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="TelegramBotBase" Version="5.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
using System;
|
||||||
|
using TelegramBotBase.Builder;
|
||||||
|
|
||||||
|
namespace JoinHiderBot
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
String apiKey = "";
|
||||||
|
|
||||||
|
var bot = BotBaseBuilder.Create()
|
||||||
|
.QuickStart<forms.Start>(apiKey)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
bot.Start();
|
||||||
|
|
||||||
|
Console.ReadLine();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using TelegramBotBase.Builder;
|
||||||
|
|
||||||
|
namespace SystemCommandsBot
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
public static config.Config BotConfig { get; set; }
|
||||||
|
|
||||||
|
|
||||||
|
static void Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
BotConfig = config.Config.load();
|
||||||
|
|
||||||
|
if (BotConfig.ApiKey == null || BotConfig.ApiKey.Trim() == "")
|
||||||
|
{
|
||||||
|
Console.WriteLine("Config created...");
|
||||||
|
Console.ReadLine();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var bot = BotBaseBuilder.Create()
|
||||||
|
.QuickStart<forms.StartForm>(BotConfig.ApiKey)
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
bot.Start();
|
||||||
|
|
||||||
|
Console.WriteLine("Bot started");
|
||||||
|
|
||||||
|
Console.ReadLine();
|
||||||
|
|
||||||
|
|
||||||
|
bot.Stop();
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFramework>net6.0</TargetFramework>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.1" />
|
||||||
|
<PackageReference Include="TelegramBotBase" Version="5.0.0" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -0,0 +1,30 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
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
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,172 @@
|
|||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
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);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using TelegramBotBase;
|
|
||||||
using TelegramBotBase.Form;
|
|
||||||
using TelegramBaseTest.Tests;
|
|
||||||
|
|
||||||
namespace TelegramBaseTest
|
|
||||||
{
|
|
||||||
class Program
|
|
||||||
{
|
|
||||||
static void Main(string[] args)
|
|
||||||
{
|
|
||||||
|
|
||||||
String APIKey = "{YOUR API KEY}";
|
|
||||||
|
|
||||||
BotBase<Start> bb = new BotBase<Start>(APIKey);
|
|
||||||
|
|
||||||
bb.SystemCalls.Add("/start");
|
|
||||||
bb.SystemCalls.Add("/form1");
|
|
||||||
bb.SystemCalls.Add("/form2");
|
|
||||||
bb.SystemCalls.Add("/params");
|
|
||||||
|
|
||||||
bb.SystemCall += async (s, en) =>
|
|
||||||
{
|
|
||||||
switch (en.Command)
|
|
||||||
{
|
|
||||||
case "/start":
|
|
||||||
|
|
||||||
var start = new Start();
|
|
||||||
|
|
||||||
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 "/params":
|
|
||||||
|
|
||||||
String 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;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
bb.Start();
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Console.WriteLine("Telegram Bot started...");
|
|
||||||
|
|
||||||
Console.WriteLine("Press q to quit application.");
|
|
||||||
|
|
||||||
|
|
||||||
Console.ReadLine();
|
|
||||||
|
|
||||||
bb.Stop();
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<Project ToolsVersion="14.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
|
||||||
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
|
|
||||||
<PropertyGroup>
|
|
||||||
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
|
|
||||||
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
|
|
||||||
<ProjectGuid>{5817184C-0D59-4924-AC6C-6B943967811C}</ProjectGuid>
|
|
||||||
<OutputType>Exe</OutputType>
|
|
||||||
<AppDesignerFolder>Properties</AppDesignerFolder>
|
|
||||||
<RootNamespace>TelegramBaseTest</RootNamespace>
|
|
||||||
<AssemblyName>TelegramBaseTest</AssemblyName>
|
|
||||||
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
|
|
||||||
<FileAlignment>512</FileAlignment>
|
|
||||||
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugSymbols>true</DebugSymbols>
|
|
||||||
<DebugType>full</DebugType>
|
|
||||||
<Optimize>false</Optimize>
|
|
||||||
<OutputPath>bin\Debug\</OutputPath>
|
|
||||||
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
|
||||||
<PlatformTarget>AnyCPU</PlatformTarget>
|
|
||||||
<DebugType>pdbonly</DebugType>
|
|
||||||
<Optimize>true</Optimize>
|
|
||||||
<OutputPath>bin\Release\</OutputPath>
|
|
||||||
<DefineConstants>TRACE</DefineConstants>
|
|
||||||
<ErrorReport>prompt</ErrorReport>
|
|
||||||
<WarningLevel>4</WarningLevel>
|
|
||||||
</PropertyGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Reference Include="Newtonsoft.Json, Version=12.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Newtonsoft.Json.12.0.1\lib\net45\Newtonsoft.Json.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
<Reference Include="System" />
|
|
||||||
<Reference Include="System.Core" />
|
|
||||||
<Reference Include="System.Drawing" />
|
|
||||||
<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=14.10.0.0, Culture=neutral, processorArchitecture=MSIL">
|
|
||||||
<HintPath>..\packages\Telegram.Bot.14.10.0\lib\net45\Telegram.Bot.dll</HintPath>
|
|
||||||
</Reference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Include="Program.cs" />
|
|
||||||
<Compile Include="Properties\AssemblyInfo.cs" />
|
|
||||||
<Compile Include="Tests\ButtonTestForm.cs" />
|
|
||||||
<Compile Include="Tests\ProgressTest.cs" />
|
|
||||||
<Compile Include="Tests\Register\PerForm.cs" />
|
|
||||||
<Compile Include="Tests\Register\PerStep.cs" />
|
|
||||||
<Compile Include="Tests\Register\Start.cs" />
|
|
||||||
<Compile Include="Tests\Register\Steps\Data.cs" />
|
|
||||||
<Compile Include="Tests\Register\Steps\Step3.cs" />
|
|
||||||
<Compile Include="Tests\Register\Steps\Step2.cs" />
|
|
||||||
<Compile Include="Tests\Register\Steps\Step1.cs" />
|
|
||||||
<Compile Include="Tests\SimpleForm.cs" />
|
|
||||||
<Compile Include="Tests\Start.cs" />
|
|
||||||
<Compile Include="Tests\TestForm.cs" />
|
|
||||||
<Compile Include="Tests\TestForm2.cs" />
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<None Include="App.config">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</None>
|
|
||||||
<None Include="packages.config">
|
|
||||||
<SubType>Designer</SubType>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj">
|
|
||||||
<Project>{a61eda27-cfdf-4bcb-b2d6-184f94904f2d}</Project>
|
|
||||||
<Name>TelegramBotBase</Name>
|
|
||||||
</ProjectReference>
|
|
||||||
</ItemGroup>
|
|
||||||
<ItemGroup />
|
|
||||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
|
||||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
|
||||||
Other similar extension points exist, see Microsoft.Common.targets.
|
|
||||||
<Target Name="BeforeBuild">
|
|
||||||
</Target>
|
|
||||||
<Target Name="AfterBuild">
|
|
||||||
</Target>
|
|
||||||
-->
|
|
||||||
</Project>
|
|
||||||
@@ -1,76 +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 TelegramBaseTest.Tests
|
|
||||||
{
|
|
||||||
public class Start : FormBase
|
|
||||||
{
|
|
||||||
|
|
||||||
public override async Task Action(MessageResult message)
|
|
||||||
{
|
|
||||||
var call = message.GetData<CallbackData>();
|
|
||||||
|
|
||||||
await message.ConfirmAction();
|
|
||||||
|
|
||||||
|
|
||||||
if (call == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
switch(call.Value)
|
|
||||||
{
|
|
||||||
case "text":
|
|
||||||
|
|
||||||
var sf = new SimpleForm();
|
|
||||||
|
|
||||||
await this.NavigateTo(sf);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "buttons":
|
|
||||||
|
|
||||||
var bf = new ButtonTestForm();
|
|
||||||
|
|
||||||
await this.NavigateTo(bf);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "progress":
|
|
||||||
|
|
||||||
var pf = new ProgressTest();
|
|
||||||
|
|
||||||
await this.NavigateTo(pf);
|
|
||||||
|
|
||||||
break;
|
|
||||||
|
|
||||||
case "registration":
|
|
||||||
|
|
||||||
var reg = new Register.Start();
|
|
||||||
|
|
||||||
await this.NavigateTo(reg);
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public override async Task Render(MessageResult message)
|
|
||||||
{
|
|
||||||
|
|
||||||
ButtonForm 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()));
|
|
||||||
|
|
||||||
await this.Device.Send("Choose your test:", btn);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<packages>
|
|
||||||
<package id="Newtonsoft.Json" version="12.0.1" targetFramework="net452" />
|
|
||||||
<package id="System.Net.Requests" version="4.3.0" targetFramework="net452" />
|
|
||||||
<package id="Telegram.Bot" version="14.10.0" targetFramework="net452" />
|
|
||||||
</packages>
|
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
using System;
|
||||||
|
using System.Drawing;
|
||||||
|
using System.Drawing.Imaging;
|
||||||
|
using System.IO;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types.InputFiles;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Sessions;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Extensions.Images
|
||||||
|
{
|
||||||
|
public static class ImageExtensions
|
||||||
|
{
|
||||||
|
public static Stream ToStream(this Image image, ImageFormat format)
|
||||||
|
{
|
||||||
|
var stream = new System.IO.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))
|
||||||
|
{
|
||||||
|
InputOnlineFile fts = new InputOnlineFile(fileStream, name);
|
||||||
|
|
||||||
|
return await session.SendPhoto(fts, caption: 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))
|
||||||
|
{
|
||||||
|
InputOnlineFile fts = new InputOnlineFile(fileStream, name);
|
||||||
|
|
||||||
|
return await session.SendPhoto(fts, caption: caption, buttons, replyTo, disableNotification);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
# TelegramBotBase.Extensions.Images
|
||||||
|
|
||||||
|
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images/)
|
||||||
|
[](https://www.t.me/tgbotbase)
|
||||||
|
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
|
||||||
|
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Images)
|
||||||
@@ -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,77 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
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,186 @@
|
|||||||
|
using TelegramBotBase.Interfaces;
|
||||||
|
using TelegramBotBase.Builder.Interfaces;
|
||||||
|
using System;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using Microsoft.Data.SqlClient;
|
||||||
|
using System.Data;
|
||||||
|
|
||||||
|
namespace TelegramBotBase.Extensions.Serializer.Database.MSSQL
|
||||||
|
{
|
||||||
|
public class MSSQLSerializer : IStateMachine
|
||||||
|
{
|
||||||
|
public Type FallbackStateForm { get; set; }
|
||||||
|
public string ConnectionString { get; }
|
||||||
|
public String TablePrefix { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Will initialize the state machine.
|
||||||
|
/// </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)
|
||||||
|
{
|
||||||
|
if (ConnectionString is null)
|
||||||
|
{
|
||||||
|
throw new ArgumentNullException(nameof(ConnectionString));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.ConnectionString = ConnectionString;
|
||||||
|
|
||||||
|
this.TablePrefix = tablePrefix;
|
||||||
|
|
||||||
|
this.FallbackStateForm = fallbackStateForm;
|
||||||
|
|
||||||
|
if (this.FallbackStateForm != null && !this.FallbackStateForm.IsSubclassOf(typeof(FormBase)))
|
||||||
|
{
|
||||||
|
throw new ArgumentException("FallbackStateForm is not a subclass of FormBase");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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 data_command = connection.CreateCommand();
|
||||||
|
data_command.CommandText = "SELECT [key], value, type FROM " + TablePrefix + "devices_sessions_data WHERE deviceId = @deviceId";
|
||||||
|
data_command.Parameters.Add(new SqlParameter("@deviceId", r["deviceId"]));
|
||||||
|
|
||||||
|
var data_table = new DataTable();
|
||||||
|
using (var dataAdapter2 = new SqlDataAdapter(data_command))
|
||||||
|
{
|
||||||
|
dataAdapter2.Fill(data_table);
|
||||||
|
|
||||||
|
foreach (DataRow r2 in data_table.Rows)
|
||||||
|
{
|
||||||
|
var key = r2["key"].ToString();
|
||||||
|
var type = Type.GetType(r2["type"].ToString());
|
||||||
|
|
||||||
|
var value = Newtonsoft.Json.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 clear_command = connection.CreateCommand();
|
||||||
|
|
||||||
|
clear_command.CommandText = $"DELETE FROM {TablePrefix}devices_sessions_data";
|
||||||
|
|
||||||
|
clear_command.ExecuteNonQuery();
|
||||||
|
|
||||||
|
clear_command.CommandText = $"DELETE FROM {TablePrefix}devices_sessions";
|
||||||
|
|
||||||
|
clear_command.ExecuteNonQuery();
|
||||||
|
|
||||||
|
//Prepare new session commands
|
||||||
|
var session_command = connection.CreateCommand();
|
||||||
|
var data_command = connection.CreateCommand();
|
||||||
|
|
||||||
|
session_command.CommandText = "INSERT INTO " + TablePrefix + "devices_sessions (deviceId, deviceTitle, FormUri, QualifiedName) VALUES (@deviceId, @deviceTitle, @FormUri, @QualifiedName)";
|
||||||
|
session_command.Parameters.Add(new SqlParameter("@deviceId", ""));
|
||||||
|
session_command.Parameters.Add(new SqlParameter("@deviceTitle", ""));
|
||||||
|
session_command.Parameters.Add(new SqlParameter("@FormUri", ""));
|
||||||
|
session_command.Parameters.Add(new SqlParameter("@QualifiedName", ""));
|
||||||
|
|
||||||
|
data_command.CommandText = "INSERT INTO " + TablePrefix + "devices_sessions_data (deviceId, [key], value, type) VALUES (@deviceId, @key, @value, @type)";
|
||||||
|
data_command.Parameters.Add(new SqlParameter("@deviceId", ""));
|
||||||
|
data_command.Parameters.Add(new SqlParameter("@key", ""));
|
||||||
|
data_command.Parameters.Add(new SqlParameter("@value", ""));
|
||||||
|
data_command.Parameters.Add(new SqlParameter("@type", ""));
|
||||||
|
|
||||||
|
//Store session data in database
|
||||||
|
foreach (var state in container.States)
|
||||||
|
{
|
||||||
|
session_command.Parameters["@deviceId"].Value = state.DeviceId;
|
||||||
|
session_command.Parameters["@deviceTitle"].Value = state.ChatTitle ?? "";
|
||||||
|
session_command.Parameters["@FormUri"].Value = state.FormUri;
|
||||||
|
session_command.Parameters["@QualifiedName"].Value = state.QualifiedName;
|
||||||
|
|
||||||
|
session_command.ExecuteNonQuery();
|
||||||
|
|
||||||
|
foreach (var data in state.Values)
|
||||||
|
{
|
||||||
|
data_command.Parameters["@deviceId"].Value = state.DeviceId;
|
||||||
|
data_command.Parameters["@key"].Value = data.Key;
|
||||||
|
|
||||||
|
var type = data.Value.GetType();
|
||||||
|
|
||||||
|
if (type.IsPrimitive || type.Equals(typeof(string)))
|
||||||
|
{
|
||||||
|
data_command.Parameters["@value"].Value = data.Value;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
data_command.Parameters["@value"].Value = Newtonsoft.Json.JsonConvert.SerializeObject(data.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
data_command.Parameters["@type"].Value = type.AssemblyQualifiedName;
|
||||||
|
|
||||||
|
data_command.ExecuteNonQuery();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
connection.Close();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# TelegramBotBase.Extensions.Serializer.Database.MSSQL
|
||||||
|
|
||||||
|
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL/)
|
||||||
|
[](https://www.t.me/tgbotbase)
|
||||||
|
|
||||||
|
|
||||||
|
[](https://raw.githubusercontent.com/MajMcCloud/TelegramBotFramework/master/LICENCE.md)
|
||||||
|
[](https://www.nuget.org/packages/TelegramBotBase.Extensions.Serializer.Database.MSSQL)
|
||||||
|
|
||||||
|
## 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,37 @@
|
|||||||
|
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
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<startup>
|
<startup>
|
||||||
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
|
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
|
||||||
</startup>
|
</startup>
|
||||||
<runtime>
|
<runtime>
|
||||||
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
<dependentAssembly>
|
<dependentAssembly>
|
||||||
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
|
<assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral"/>
|
||||||
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
|
<bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0"/>
|
||||||
</dependentAssembly>
|
</dependentAssembly>
|
||||||
</assemblyBinding>
|
</assemblyBinding>
|
||||||
</runtime>
|
</runtime>
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBaseTest.Tests;
|
||||||
|
using TelegramBotBase.Commands;
|
||||||
|
using TelegramBotBase.Builder;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest
|
||||||
|
{
|
||||||
|
class Program
|
||||||
|
{
|
||||||
|
static async void Main(string[] args)
|
||||||
|
{
|
||||||
|
|
||||||
|
String APIKey = "";
|
||||||
|
|
||||||
|
var bb = BotBaseBuilder
|
||||||
|
.Create()
|
||||||
|
.WithAPIKey(APIKey)
|
||||||
|
.DefaultMessageLoop()
|
||||||
|
.WithStartForm<Start>()
|
||||||
|
.NoProxy()
|
||||||
|
.CustomCommands(a =>
|
||||||
|
{
|
||||||
|
a.Start("Starts the bot");
|
||||||
|
a.Add("myid", "Returns my Device ID");
|
||||||
|
a.Help("Should show you some help");
|
||||||
|
a.Settings("Should show you some settings");
|
||||||
|
a.Add("form1", "Opens test form 1");
|
||||||
|
a.Add("form2", "Opens test form 2");
|
||||||
|
a.Add("params", "Returns all send parameters as a message.");
|
||||||
|
})
|
||||||
|
.NoSerialization()
|
||||||
|
.UseEnglish()
|
||||||
|
.Build();
|
||||||
|
|
||||||
|
|
||||||
|
bb.BotCommand += Bb_BotCommand;
|
||||||
|
|
||||||
|
//Update Bot commands to botfather
|
||||||
|
await bb.UploadBotCommands();
|
||||||
|
|
||||||
|
bb.SetSetting(TelegramBotBase.Enums.eSettings.LogAllMessages, true);
|
||||||
|
|
||||||
|
bb.Message += (s, en) =>
|
||||||
|
{
|
||||||
|
Console.WriteLine(en.DeviceId + " " + en.Message.MessageText + " " + (en.Message.RawData ?? ""));
|
||||||
|
};
|
||||||
|
|
||||||
|
bb.Start();
|
||||||
|
|
||||||
|
Console.WriteLine("Telegram Bot started...");
|
||||||
|
|
||||||
|
Console.WriteLine("Press q to quit application.");
|
||||||
|
|
||||||
|
|
||||||
|
Console.ReadLine();
|
||||||
|
|
||||||
|
bb.Stop();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private static async Task Bb_BotCommand(object sender, TelegramBotBase.Args.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":
|
||||||
|
|
||||||
|
String 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,11 +5,11 @@ using System.Runtime.InteropServices;
|
|||||||
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
// Allgemeine Informationen über eine Assembly werden über die folgenden
|
||||||
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern,
|
||||||
// die einer Assembly zugeordnet sind.
|
// die einer Assembly zugeordnet sind.
|
||||||
[assembly: AssemblyTitle("TelegramBaseTest")]
|
[assembly: AssemblyTitle("TelegramBotBaseTest")]
|
||||||
[assembly: AssemblyDescription("")]
|
[assembly: AssemblyDescription("")]
|
||||||
[assembly: AssemblyConfiguration("")]
|
[assembly: AssemblyConfiguration("")]
|
||||||
[assembly: AssemblyCompany("")]
|
[assembly: AssemblyCompany("")]
|
||||||
[assembly: AssemblyProduct("TelegramBaseTest")]
|
[assembly: AssemblyProduct("TelegramBotBaseTest")]
|
||||||
[assembly: AssemblyCopyright("Copyright © 2017")]
|
[assembly: AssemblyCopyright("Copyright © 2017")]
|
||||||
[assembly: AssemblyTrademark("")]
|
[assembly: AssemblyTrademark("")]
|
||||||
[assembly: AssemblyCulture("")]
|
[assembly: AssemblyCulture("")]
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>Exe</OutputType>
|
||||||
|
<TargetFrameworks>netcoreapp3.1;net5;net6</TargetFrameworks>
|
||||||
|
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
|
||||||
|
<Configurations>Debug;Release</Configurations>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugSymbols>true</DebugSymbols>
|
||||||
|
<DebugType>full</DebugType>
|
||||||
|
<Optimize>false</Optimize>
|
||||||
|
<OutputPath>bin\Debug\</OutputPath>
|
||||||
|
<DefineConstants>DEBUG;TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
|
||||||
|
<PlatformTarget>AnyCPU</PlatformTarget>
|
||||||
|
<DebugType>pdbonly</DebugType>
|
||||||
|
<Optimize>true</Optimize>
|
||||||
|
<OutputPath>bin\Release\</OutputPath>
|
||||||
|
<DefineConstants>TRACE</DefineConstants>
|
||||||
|
<ErrorReport>prompt</ErrorReport>
|
||||||
|
<WarningLevel>4</WarningLevel>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\TelegramBotBase.Extensions.Images\TelegramBotBase.Extensions.Images.csproj" />
|
||||||
|
<ProjectReference Include="..\TelegramBotBase\TelegramBotBase.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -6,12 +6,17 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests
|
namespace TelegramBotBaseTest.Tests
|
||||||
{
|
{
|
||||||
public class ButtonTestForm : AutoCleanForm
|
public class ButtonTestForm : AutoCleanForm
|
||||||
{
|
{
|
||||||
|
|
||||||
public override async Task Opened()
|
public ButtonTestForm()
|
||||||
|
{
|
||||||
|
this.Opened += ButtonTestForm_Opened;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ButtonTestForm_Opened(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
await this.Device.Send("Hello world! (Click 'back' to get back to Start)");
|
await this.Device.Send("Hello world! (Click 'back' to get back to Start)");
|
||||||
}
|
}
|
||||||
@@ -57,9 +62,7 @@ namespace TelegramBaseTest.Tests
|
|||||||
|
|
||||||
case "back":
|
case "back":
|
||||||
|
|
||||||
var st = new Start();
|
var st = new Menu();
|
||||||
|
|
||||||
await st.Init();
|
|
||||||
|
|
||||||
await this.NavigateTo(st);
|
await this.NavigateTo(st);
|
||||||
|
|
||||||
@@ -85,6 +88,8 @@ namespace TelegramBaseTest.Tests
|
|||||||
|
|
||||||
btn.AddButtonRow(new ButtonBase("Button 3", new CallbackData("a", "button3").Serialize()), new ButtonBase("Button 4", new CallbackData("a", "button4").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()));
|
btn.AddButtonRow(new ButtonBase("Back", new CallbackData("a", "back").Serialize()));
|
||||||
|
|
||||||
await this.Device.Send("Click a button", btn);
|
await this.Device.Send("Click a button", btn);
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class ButtonGridForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonGrid m_Buttons = null;
|
||||||
|
|
||||||
|
public ButtonGridForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += ButtonGridForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ButtonGridForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
m_Buttons = new ButtonGrid();
|
||||||
|
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard;
|
||||||
|
|
||||||
|
ButtonForm 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"));
|
||||||
|
|
||||||
|
m_Buttons.ButtonsForm = bf;
|
||||||
|
|
||||||
|
m_Buttons.ButtonClicked += Bg_ButtonClicked;
|
||||||
|
|
||||||
|
this.AddControl(m_Buttons);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Button == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (e.Button.Value == "back")
|
||||||
|
{
|
||||||
|
var start = new Menu();
|
||||||
|
await this.NavigateTo(start);
|
||||||
|
}
|
||||||
|
else if (e.Button.Value == "switch")
|
||||||
|
{
|
||||||
|
switch (m_Buttons.KeyboardType)
|
||||||
|
{
|
||||||
|
case TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard:
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard;
|
||||||
|
break;
|
||||||
|
case TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard:
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
await this.Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class ButtonGridPagingForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonGrid m_Buttons = null;
|
||||||
|
|
||||||
|
public ButtonGridPagingForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += ButtonGridForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ButtonGridForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
m_Buttons = new ButtonGrid();
|
||||||
|
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
|
||||||
|
m_Buttons.EnablePaging = true;
|
||||||
|
m_Buttons.EnableSearch = true;
|
||||||
|
|
||||||
|
m_Buttons.HeadLayoutButtonRow = new List<ButtonBase>() { new ButtonBase("Back", "back") };
|
||||||
|
|
||||||
|
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
|
||||||
|
foreach (var c in countries)
|
||||||
|
{
|
||||||
|
bf.AddButtonRow(new ButtonBase(c.EnglishName, c.EnglishName));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Buttons.ButtonsForm = bf;
|
||||||
|
|
||||||
|
m_Buttons.ButtonClicked += Bg_ButtonClicked;
|
||||||
|
|
||||||
|
this.AddControl(m_Buttons);
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Bg_ButtonClicked(object sender, ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
if (e.Button == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (e.Button.Value == "back")
|
||||||
|
{
|
||||||
|
var start = new Menu();
|
||||||
|
await this.NavigateTo(start);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
await this.Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class ButtonGridTagForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
TaggedButtonGrid m_Buttons = null;
|
||||||
|
|
||||||
|
public ButtonGridTagForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += ButtonGridTagForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ButtonGridTagForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
m_Buttons = new TaggedButtonGrid();
|
||||||
|
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
|
||||||
|
m_Buttons.EnablePaging = true;
|
||||||
|
|
||||||
|
m_Buttons.HeadLayoutButtonRow = new List<ButtonBase>() { new ButtonBase("Back", "back") };
|
||||||
|
|
||||||
|
|
||||||
|
var countries = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
|
||||||
|
foreach (var c in countries)
|
||||||
|
{
|
||||||
|
bf.AddButtonRow(new TagButtonBase(c.EnglishName, c.EnglishName, c.Parent.EnglishName));
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Buttons.Tags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
|
||||||
|
m_Buttons.SelectedTags = countries.Select(a => a.Parent.EnglishName).Distinct().OrderBy(a => a).ToList();
|
||||||
|
|
||||||
|
m_Buttons.EnableCheckAllTools = true;
|
||||||
|
|
||||||
|
m_Buttons.DataSource = new TelegramBotBase.Datasources.ButtonFormDataSource(bf);
|
||||||
|
|
||||||
|
m_Buttons.ButtonClicked += Bg_ButtonClicked;
|
||||||
|
|
||||||
|
this.AddControl(m_Buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
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 this.NavigateTo(start);
|
||||||
|
return;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
await this.Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class CalendarPickerForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
public CalendarPicker Picker { get; set; }
|
||||||
|
|
||||||
|
int? selectedDateMessage { get; set; }
|
||||||
|
|
||||||
|
public CalendarPickerForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
this.Init += CalendarPickerForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CalendarPickerForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
this.Picker = new CalendarPicker();
|
||||||
|
this.Picker.Title = "Datum auswählen / Pick date";
|
||||||
|
|
||||||
|
this.AddControl(Picker);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(message.RawData)
|
||||||
|
{
|
||||||
|
case "back":
|
||||||
|
|
||||||
|
var s = new Menu();
|
||||||
|
|
||||||
|
await this.NavigateTo(s);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
|
||||||
|
s = "Selected date is " + this.Picker.SelectedDate.ToShortDateString() + "\r\n";
|
||||||
|
s += "Selected month is " + this.Picker.Culture.DateTimeFormat.MonthNames[this.Picker.VisibleMonth.Month - 1] + "\r\n";
|
||||||
|
s += "Selected year is " + this.Picker.VisibleMonth.Year.ToString();
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
bf.AddButtonRow(new ButtonBase("Back","back"));
|
||||||
|
|
||||||
|
if (selectedDateMessage != null)
|
||||||
|
{
|
||||||
|
await this.Device.Edit(this.selectedDateMessage.Value, s, bf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var m = await this.Device.Send(s, bf);
|
||||||
|
this.selectedDateMessage = m.MessageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class CheckedButtonListForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
CheckedButtonList m_Buttons = null;
|
||||||
|
|
||||||
|
public CheckedButtonListForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += CheckedButtonListForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task CheckedButtonListForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
m_Buttons = new CheckedButtonList();
|
||||||
|
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard;
|
||||||
|
m_Buttons.EnablePaging = true;
|
||||||
|
|
||||||
|
m_Buttons.HeadLayoutButtonRow = new List<ButtonBase>() { new ButtonBase("Back", "back"), new ButtonBase("Switch Keyboard", "switch") };
|
||||||
|
|
||||||
|
m_Buttons.SubHeadLayoutButtonRow = new List<ButtonBase>() { new ButtonBase("No checked items", "$") };
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
|
||||||
|
for (int i = 0; i < 30; i++)
|
||||||
|
{
|
||||||
|
bf.AddButtonRow($"{i + 1}. Item", i.ToString());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_Buttons.DataSource = new TelegramBotBase.Datasources.ButtonFormDataSource(bf);
|
||||||
|
|
||||||
|
m_Buttons.ButtonClicked += Bg_ButtonClicked;
|
||||||
|
m_Buttons.CheckedChanged += M_Buttons_CheckedChanged;
|
||||||
|
|
||||||
|
this.AddControl(m_Buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task M_Buttons_CheckedChanged(object sender, CheckedChangedEventArgs e)
|
||||||
|
{
|
||||||
|
m_Buttons.SubHeadLayoutButtonRow = new List<ButtonBase>() { new ButtonBase($"{m_Buttons.CheckedItems.Count} checked items", "$") };
|
||||||
|
}
|
||||||
|
|
||||||
|
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":
|
||||||
|
switch (m_Buttons.KeyboardType)
|
||||||
|
{
|
||||||
|
case TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard:
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard;
|
||||||
|
break;
|
||||||
|
case TelegramBotBase.Enums.eKeyboardType.InlineKeyBoard:
|
||||||
|
m_Buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
await Device.Send($"Button clicked with Text: {e.Button.Text} and Value {e.Button.Value}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
using System;
|
||||||
|
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class MonthPickerForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
public MonthPicker Picker { get; set; }
|
||||||
|
|
||||||
|
int? selectedDateMessage { get; set; }
|
||||||
|
|
||||||
|
public MonthPickerForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
this.Init += MonthPickerForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task MonthPickerForm_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
this.Picker = new MonthPicker();
|
||||||
|
this.Picker.Title = "Monat auswählen / Pick month";
|
||||||
|
this.AddControl(Picker);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch(message.RawData)
|
||||||
|
{
|
||||||
|
case "back":
|
||||||
|
|
||||||
|
var s = new Menu();
|
||||||
|
|
||||||
|
await this.NavigateTo(s);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
|
||||||
|
s += "Selected month is " + this.Picker.Culture.DateTimeFormat.MonthNames[this.Picker.SelectedDate.Month - 1] + "\r\n";
|
||||||
|
s += "Selected year is " + this.Picker.VisibleMonth.Year.ToString();
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
bf.AddButtonRow(new ButtonBase("Back","back"));
|
||||||
|
|
||||||
|
if (selectedDateMessage != null)
|
||||||
|
{
|
||||||
|
await this.Device.Edit(this.selectedDateMessage.Value, s, bf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var m = await this.Device.Send(s, bf);
|
||||||
|
this.selectedDateMessage = m.MessageId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class MultiToggleButtons : AutoCleanForm
|
||||||
|
{
|
||||||
|
public MultiToggleButtons()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += ToggleButtons_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ToggleButtons_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
var mtb = new MultiToggleButton();
|
||||||
|
|
||||||
|
mtb.Options = new List<ButtonBase>() { new ButtonBase("Option 1", "1"), new ButtonBase("Option 2", "2"), new ButtonBase("Option 3", "3") };
|
||||||
|
mtb.SelectedOption = mtb.Options.FirstOrDefault();
|
||||||
|
mtb.Toggled += Tb_Toggled;
|
||||||
|
this.AddControl(mtb);
|
||||||
|
|
||||||
|
mtb = new MultiToggleButton();
|
||||||
|
|
||||||
|
mtb.Options = new List<ButtonBase>() { new ButtonBase("Option 4", "4"), new ButtonBase("Option 5", "5"), new ButtonBase("Option 6", "6") };
|
||||||
|
mtb.SelectedOption = mtb.Options.FirstOrDefault();
|
||||||
|
mtb.AllowEmptySelection = false;
|
||||||
|
mtb.Toggled += Tb_Toggled;
|
||||||
|
this.AddControl(mtb);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Tb_Toggled(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var tb = sender as MultiToggleButton;
|
||||||
|
if (tb.SelectedOption != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine(tb.ID.ToString() + " was pressed, and toggled to " + tb.SelectedOption.Value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Selection for " + tb.ID.ToString() + " has been removed.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class MultiViewForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
Subclass.MultiViewTest mvt = null;
|
||||||
|
|
||||||
|
ButtonGrid bg = null;
|
||||||
|
|
||||||
|
public MultiViewForm()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
this.Init += MultiViewForm_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task MultiViewForm_Init(object sender, TelegramBotBase.Args.InitEventArgs e)
|
||||||
|
{
|
||||||
|
mvt = new Subclass.MultiViewTest();
|
||||||
|
|
||||||
|
AddControl(mvt);
|
||||||
|
|
||||||
|
bg = new ButtonGrid();
|
||||||
|
bg.ButtonsForm = new ButtonForm();
|
||||||
|
bg.ButtonsForm.AddButtonRow("Back", "$back$");
|
||||||
|
bg.ButtonClicked += Bg_ButtonClicked;
|
||||||
|
bg.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
AddControl(bg);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Bg_ButtonClicked(object sender, TelegramBotBase.Args.ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
switch(e.Button.Value)
|
||||||
|
{
|
||||||
|
case "$back$":
|
||||||
|
|
||||||
|
var mn = new Menu();
|
||||||
|
await NavigateTo(mn);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls.Subclass
|
||||||
|
{
|
||||||
|
public class MultiViewTest : TelegramBotBase.Controls.Hybrid.MultiView
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Action(MessageResult result, string value = null)
|
||||||
|
{
|
||||||
|
|
||||||
|
switch (result.RawData)
|
||||||
|
{
|
||||||
|
case "back":
|
||||||
|
|
||||||
|
this.SelectedViewIndex--;
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "next":
|
||||||
|
|
||||||
|
this.SelectedViewIndex++;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task RenderView(RenderViewEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonForm 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,51 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class ToggleButtons : AutoCleanForm
|
||||||
|
{
|
||||||
|
public ToggleButtons()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Init += ToggleButtons_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task ToggleButtons_Init(object sender, InitEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
var tb = new ToggleButton();
|
||||||
|
tb.Checked = true;
|
||||||
|
tb.Toggled += Tb_Toggled;
|
||||||
|
|
||||||
|
this.AddControl(tb);
|
||||||
|
|
||||||
|
tb = new ToggleButton();
|
||||||
|
tb.Checked = false;
|
||||||
|
tb.Toggled += Tb_Toggled;
|
||||||
|
|
||||||
|
this.AddControl(tb);
|
||||||
|
|
||||||
|
tb = new ToggleButton();
|
||||||
|
tb.Checked = true;
|
||||||
|
tb.Toggled += Tb_Toggled;
|
||||||
|
|
||||||
|
this.AddControl(tb);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
private void Tb_Toggled(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var tb = sender as ToggleButton;
|
||||||
|
Console.WriteLine(tb.ID.ToString() + " was pressed, and toggled to " + (tb.Checked ? "Checked" : "Unchecked"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,101 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Controls;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Controls
|
||||||
|
{
|
||||||
|
public class TreeViewForms : AutoCleanForm
|
||||||
|
{
|
||||||
|
public TreeView view { get; set; }
|
||||||
|
|
||||||
|
private int? MessageId { get; set; }
|
||||||
|
|
||||||
|
public TreeViewForms()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
this.Init += TreeViewForms_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async 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);
|
||||||
|
|
||||||
|
this.AddControl(view);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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 this.NavigateTo(start);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
String s = "";
|
||||||
|
|
||||||
|
s += "Selected Node: " + (this.view.SelectedNode?.Text ?? "(null)") + "\r\n";
|
||||||
|
|
||||||
|
s += "Visible Node: " + (this.view.VisibleNode?.Text ?? "(top)") + "\r\n";
|
||||||
|
|
||||||
|
s += "Visible Path: " + this.view.GetPath() + "\r\n";
|
||||||
|
s += "Selected Path: " + (this.view.SelectedNode?.GetPath() ?? "(null)") + "\r\n";
|
||||||
|
|
||||||
|
ButtonForm bf = new ButtonForm();
|
||||||
|
bf.AddButtonRow(new ButtonBase("Back", "back"));
|
||||||
|
|
||||||
|
if (MessageId != null)
|
||||||
|
{
|
||||||
|
await this.Device.Edit(this.MessageId.Value, s, bf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
var m = await this.Device.Send(s, bf);
|
||||||
|
this.MessageId = m.MessageId;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,143 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using Telegram.Bot.Types.InputFiles;
|
||||||
|
using Telegram.Bot.Types.ReplyMarkups;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests
|
||||||
|
{
|
||||||
|
public class DataForm : AutoCleanForm
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task SentData(DataResult data)
|
||||||
|
{
|
||||||
|
String tmp = "";
|
||||||
|
InputOnlineFile file;
|
||||||
|
|
||||||
|
switch (data.Type)
|
||||||
|
{
|
||||||
|
case Telegram.Bot.Types.Enums.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 this.Device.Send("Your contact: \r\n" + tmp, replyTo: data.MessageId);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Telegram.Bot.Types.Enums.MessageType.Document:
|
||||||
|
|
||||||
|
file = new InputOnlineFile(data.Document.FileId);
|
||||||
|
|
||||||
|
await this.Device.SendDocument(file, "Your uploaded document");
|
||||||
|
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Telegram.Bot.Types.Enums.MessageType.Video:
|
||||||
|
|
||||||
|
file = new InputOnlineFile(data.Document.FileId);
|
||||||
|
|
||||||
|
await this.Device.SendDocument(file, "Your uploaded video");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Telegram.Bot.Types.Enums.MessageType.Audio:
|
||||||
|
|
||||||
|
file = new InputOnlineFile(data.Document.FileId);
|
||||||
|
|
||||||
|
await this.Device.SendDocument(file, "Your uploaded audio");
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Telegram.Bot.Types.Enums.MessageType.Location:
|
||||||
|
|
||||||
|
tmp += "Lat: " + data.Location.Latitude + "\r\n";
|
||||||
|
tmp += "Lng: " + data.Location.Longitude + "\r\n";
|
||||||
|
|
||||||
|
await this.Device.Send("Your location: \r\n" + tmp, replyTo: data.MessageId);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case Telegram.Bot.Types.Enums.MessageType.Photo:
|
||||||
|
|
||||||
|
InputOnlineFile photo = new InputOnlineFile(data.Photos.Last().FileId);
|
||||||
|
|
||||||
|
await this.Device.Send("Your image: ", replyTo: data.MessageId);
|
||||||
|
await this.Client.TelegramClient.SendPhotoAsync(this.Device.DeviceId, photo);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
|
||||||
|
await this.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 this.Device.RequestContact();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "location":
|
||||||
|
|
||||||
|
await this.Device.RequestLocation();
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "back":
|
||||||
|
|
||||||
|
message.Handled = true;
|
||||||
|
|
||||||
|
var start = new Menu();
|
||||||
|
|
||||||
|
await this.NavigateTo(start);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Render(MessageResult message)
|
||||||
|
{
|
||||||
|
ButtonForm 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 this.Device.Send("Please upload a contact, photo, video, audio, document or location.", bf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,163 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Globalization;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Datasources;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Datasources
|
||||||
|
{
|
||||||
|
public class CustomDataSource : ButtonFormDataSource
|
||||||
|
{
|
||||||
|
|
||||||
|
public List<String> Countries = new List<string>() { "Country 1", "Country 2", "Country 3" };
|
||||||
|
|
||||||
|
public CustomDataSource()
|
||||||
|
{
|
||||||
|
loadData();
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// This method has the example purpose of creating and loading some example data.
|
||||||
|
/// When using a database you do not need this kind of method.
|
||||||
|
/// </summary>
|
||||||
|
private void loadData()
|
||||||
|
{
|
||||||
|
//Exists data source? Read it
|
||||||
|
if (File.Exists(AppContext.BaseDirectory + "countries.json"))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var List = Newtonsoft.Json.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 = Newtonsoft.Json.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);
|
||||||
|
|
||||||
|
List<ButtonRow> lst = new List<ButtonRow>();
|
||||||
|
foreach (var c in items)
|
||||||
|
{
|
||||||
|
lst.Add(Render(c));
|
||||||
|
}
|
||||||
|
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override List<ButtonRow> AllItems()
|
||||||
|
{
|
||||||
|
List<ButtonRow> 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)
|
||||||
|
{
|
||||||
|
List<ButtonRow> rows = ItemRange(start, count);
|
||||||
|
|
||||||
|
ButtonForm lst = new ButtonForm();
|
||||||
|
foreach (var c in rows)
|
||||||
|
{
|
||||||
|
lst.AddButtonRow(c);
|
||||||
|
}
|
||||||
|
return lst;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override ButtonForm PickAllItems(string filter = null)
|
||||||
|
{
|
||||||
|
List<ButtonRow> rows = AllItems();
|
||||||
|
|
||||||
|
ButtonForm 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)
|
||||||
|
{
|
||||||
|
var s = data as String;
|
||||||
|
if (s == null)
|
||||||
|
return new ButtonRow(new ButtonBase("Empty", "zero"));
|
||||||
|
|
||||||
|
return new ButtonRow(new ButtonBase(s, s));
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int Count
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return Countries.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int ColumnCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public override int RowCount
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
return this.Count;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Controls.Hybrid;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Datasources
|
||||||
|
{
|
||||||
|
public class List : FormBase
|
||||||
|
{
|
||||||
|
ButtonGrid __buttons = null;
|
||||||
|
|
||||||
|
public List()
|
||||||
|
{
|
||||||
|
this.Init += List_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task List_Init(object sender, TelegramBotBase.Args.InitEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
__buttons = new ButtonGrid();
|
||||||
|
|
||||||
|
__buttons.EnablePaging = true;
|
||||||
|
__buttons.EnableSearch = false;
|
||||||
|
__buttons.ButtonClicked += __buttons_ButtonClicked;
|
||||||
|
__buttons.KeyboardType = TelegramBotBase.Enums.eKeyboardType.ReplyKeyboard;
|
||||||
|
__buttons.DeleteReplyMessage = true;
|
||||||
|
|
||||||
|
__buttons.HeadLayoutButtonRow = new ButtonRow(new ButtonBase("Back", "back"));
|
||||||
|
|
||||||
|
var cds = new CustomDataSource();
|
||||||
|
__buttons.DataSource = cds;
|
||||||
|
|
||||||
|
AddControl(__buttons);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task __buttons_ButtonClicked(object sender, TelegramBotBase.Args.ButtonClickedEventArgs e)
|
||||||
|
{
|
||||||
|
switch(e.Button.Value)
|
||||||
|
{
|
||||||
|
case "back":
|
||||||
|
|
||||||
|
var mn = new Menu();
|
||||||
|
await NavigateTo(mn);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Groups
|
||||||
|
{
|
||||||
|
public class GroupChange : TelegramBotBase.Form.GroupForm
|
||||||
|
{
|
||||||
|
public GroupChange()
|
||||||
|
{
|
||||||
|
this.Opened += GroupChange_Opened;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async Task GroupChange_Opened(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonForm 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 this.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 this.NavigateTo(gc);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "welcomeuser":
|
||||||
|
|
||||||
|
var wu = new WelcomeUser();
|
||||||
|
|
||||||
|
await this.NavigateTo(wu);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "linkreplace":
|
||||||
|
|
||||||
|
var lr = new LinkReplaceTest();
|
||||||
|
|
||||||
|
await this.NavigateTo(lr);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task OnGroupChanged(GroupChangedEventArgs e)
|
||||||
|
{
|
||||||
|
await this.Device.Send("Group has been changed by " + e.OriginalMessage.Message.From.FirstName + " " + e.OriginalMessage.Message.From.LastName);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,164 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Groups
|
||||||
|
{
|
||||||
|
public class LinkReplaceTest : TelegramBotBase.Form.GroupForm
|
||||||
|
{
|
||||||
|
|
||||||
|
Dictionary<long, int> Counter { get; set; } = new Dictionary<long, int>();
|
||||||
|
|
||||||
|
private const int Maximum = 3;
|
||||||
|
|
||||||
|
|
||||||
|
public LinkReplaceTest()
|
||||||
|
{
|
||||||
|
this.Opened += LinkReplaceTest_Opened;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LinkReplaceTest_Opened(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonForm 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 this.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 this.NavigateTo(gc);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "welcomeuser":
|
||||||
|
|
||||||
|
var wu = new WelcomeUser();
|
||||||
|
|
||||||
|
await this.NavigateTo(wu);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "linkreplace":
|
||||||
|
|
||||||
|
var lr = new LinkReplaceTest();
|
||||||
|
|
||||||
|
await this.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 == Telegram.Bot.Types.Enums.ChatMemberStatus.Administrator | u.Status == Telegram.Bot.Types.Enums.ChatMemberStatus.Creator)
|
||||||
|
{
|
||||||
|
await this.Device.Send("You won't get kicked,...not this time.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
await e.Device.DeleteMessage(e.MessageId);
|
||||||
|
|
||||||
|
var cp = new ChatPermissions();
|
||||||
|
cp.CanAddWebPagePreviews = false;
|
||||||
|
cp.CanChangeInfo = false;
|
||||||
|
cp.CanInviteUsers = false;
|
||||||
|
cp.CanPinMessages = false;
|
||||||
|
cp.CanSendMediaMessages = false;
|
||||||
|
cp.CanSendMessages = false;
|
||||||
|
cp.CanSendOtherMessages = false;
|
||||||
|
cp.CanSendPolls = false;
|
||||||
|
|
||||||
|
//Collect user "mistakes" with sending url, after 3 he gets kicked out.
|
||||||
|
if (Counter.ContainsKey(from))
|
||||||
|
{
|
||||||
|
Counter[from]++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Counter[from] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (Counter[from] >= 3)
|
||||||
|
{
|
||||||
|
await e.Device.KickUser(from);
|
||||||
|
|
||||||
|
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName + " has been removed from the group");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
await e.Device.RestrictUser(from, cp, DateTime.UtcNow.AddSeconds(30));
|
||||||
|
|
||||||
|
await e.Device.Send(e.Message.From.FirstName + " " + e.Message.From.LastName + " has been blocked for 30 seconds");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Call onmessage also on edited message, if someone want to spoof a failed message and insert a link.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="message"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public override async Task OnMessageEdit(MessageResult message)
|
||||||
|
{
|
||||||
|
await OnMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// https://stackoverflow.com/a/20651284
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="str"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private bool HasLinks(String str)
|
||||||
|
{
|
||||||
|
var tmp = str;
|
||||||
|
|
||||||
|
var pattern = @"^(http|https|ftp|)\://|[a-zA-Z0-9\-\.]+\.[a-zA-Z](:[a-zA-Z0-9]*)?/?([a-zA-Z0-9\-\._\?\,\'/\\\+&%\$#\=~])*[^\.\,\)\(\s]$";
|
||||||
|
Regex r = new Regex(pattern);
|
||||||
|
|
||||||
|
var matches = r.Matches(tmp);
|
||||||
|
|
||||||
|
return (matches.Count > 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,92 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Groups
|
||||||
|
{
|
||||||
|
public class WelcomeUser : TelegramBotBase.Form.GroupForm
|
||||||
|
{
|
||||||
|
|
||||||
|
public WelcomeUser()
|
||||||
|
{
|
||||||
|
this.Opened += WelcomeUser_Opened;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async Task WelcomeUser_Opened(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonForm 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 this.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 this.NavigateTo(gc);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "welcomeuser":
|
||||||
|
|
||||||
|
var wu = new WelcomeUser();
|
||||||
|
|
||||||
|
await this.NavigateTo(wu);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case "linkreplace":
|
||||||
|
|
||||||
|
var lr = new LinkReplaceTest();
|
||||||
|
|
||||||
|
await this.NavigateTo(lr);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task OnMemberChanges(MemberChangeEventArgs e)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (e.Type == Telegram.Bot.Types.Enums.MessageType.ChatMembersAdded)
|
||||||
|
{
|
||||||
|
|
||||||
|
await this.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 == Telegram.Bot.Types.Enums.MessageType.ChatMemberLeft)
|
||||||
|
{
|
||||||
|
await this.Device.Send(e.Members.Select(a => a.FirstName + " " + a.LastName).Aggregate((a, b) => a + " and " + b) + " has left the group");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,264 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBaseTest.Tests.Controls;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests
|
||||||
|
{
|
||||||
|
public class Menu : AutoCleanForm
|
||||||
|
{
|
||||||
|
public Menu()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override async Task Load(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if (message.Message.Chat.Type == Telegram.Bot.Types.Enums.ChatType.Group | message.Message.Chat.Type == Telegram.Bot.Types.Enums.ChatType.Supergroup)
|
||||||
|
{
|
||||||
|
var sf = new TelegramBotBaseTest.Tests.Groups.WelcomeUser();
|
||||||
|
|
||||||
|
await this.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 this.NavigateTo(sf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "buttons":
|
||||||
|
|
||||||
|
var bf = new ButtonTestForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(bf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "progress":
|
||||||
|
|
||||||
|
var pf = new ProgressTest();
|
||||||
|
|
||||||
|
await this.NavigateTo(pf);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "registration":
|
||||||
|
|
||||||
|
var reg = new Register.Start();
|
||||||
|
|
||||||
|
await this.NavigateTo(reg);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "form1":
|
||||||
|
|
||||||
|
var form1 = new TestForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(form1);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "form2":
|
||||||
|
|
||||||
|
var form2 = new TestForm2();
|
||||||
|
|
||||||
|
await this.NavigateTo(form2);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "data":
|
||||||
|
|
||||||
|
var data = new DataForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(data);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "calendar":
|
||||||
|
|
||||||
|
var calendar = new Controls.CalendarPickerForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(calendar);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "month":
|
||||||
|
|
||||||
|
var month = new Controls.MonthPickerForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(month);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "treeview":
|
||||||
|
|
||||||
|
var tree = new Controls.TreeViewForms();
|
||||||
|
|
||||||
|
await this.NavigateTo(tree);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "togglebuttons":
|
||||||
|
|
||||||
|
var tb = new Controls.ToggleButtons();
|
||||||
|
|
||||||
|
await this.NavigateTo(tb);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "multitogglebuttons":
|
||||||
|
|
||||||
|
var mtb = new Controls.MultiToggleButtons();
|
||||||
|
|
||||||
|
await this.NavigateTo(mtb);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "buttongrid":
|
||||||
|
|
||||||
|
var bg = new Controls.ButtonGridForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(bg);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "buttongridfilter":
|
||||||
|
|
||||||
|
var bg2 = new Controls.ButtonGridPagingForm();
|
||||||
|
|
||||||
|
await this.NavigateTo(bg2);
|
||||||
|
|
||||||
|
break;
|
||||||
|
|
||||||
|
case "buttongridtags":
|
||||||
|
|
||||||
|
var bg3 = new Controls.ButtonGridTagForm();
|
||||||
|
|
||||||
|
await this.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 Datasources.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)
|
||||||
|
{
|
||||||
|
|
||||||
|
ButtonForm 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 this.Device.Send("Choose your test:", btn);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Form.Navigation;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Navigation
|
||||||
|
{
|
||||||
|
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 {this.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 {this.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 {this.Index + 1})");
|
||||||
|
//Device.Send($"Moved back to root (Count on stack {this.Index + 1})");
|
||||||
|
|
||||||
|
return base.PopToRootAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Navigation
|
||||||
|
{
|
||||||
|
public class Form1 : FormBase
|
||||||
|
{
|
||||||
|
Message msg = null;
|
||||||
|
|
||||||
|
public Form1()
|
||||||
|
{
|
||||||
|
this.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,91 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Telegram.Bot.Types;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
using TelegramBotBase.Form.Navigation;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Navigation
|
||||||
|
{
|
||||||
|
public class Start : FormBase
|
||||||
|
{
|
||||||
|
|
||||||
|
Message msg = null;
|
||||||
|
|
||||||
|
public Start()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task Load(MessageResult message)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
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,63 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests.Notifications
|
||||||
|
{
|
||||||
|
public class Start : AutoCleanForm
|
||||||
|
{
|
||||||
|
bool sent = false;
|
||||||
|
|
||||||
|
public Start()
|
||||||
|
{
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,19 +5,23 @@ using System.Text;
|
|||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Controls.Inline;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests
|
namespace TelegramBotBaseTest.Tests
|
||||||
{
|
{
|
||||||
public class ProgressTest : AutoCleanForm
|
public class ProgressTest : AutoCleanForm
|
||||||
{
|
{
|
||||||
|
|
||||||
public ProgressTest()
|
public ProgressTest()
|
||||||
{
|
{
|
||||||
this.DeleteMode = eDeleteMode.OnLeavingForm;
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
this.Opened += ProgressTest_Opened;
|
||||||
|
this.Closed += ProgressTest_Closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Opened()
|
|
||||||
|
private async Task ProgressTest_Opened(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
await this.Device.Send("Welcome to ProgressTest");
|
await this.Device.Send("Welcome to ProgressTest");
|
||||||
}
|
}
|
||||||
@@ -32,50 +36,48 @@ namespace TelegramBaseTest.Tests
|
|||||||
if (call == null)
|
if (call == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
TelegramBotBase.Controls.ProgressBar Bar = null;
|
ProgressBar Bar = null;
|
||||||
|
|
||||||
switch (call.Value)
|
switch (call.Value)
|
||||||
{
|
{
|
||||||
case "standard":
|
case "standard":
|
||||||
|
|
||||||
Bar = new TelegramBotBase.Controls.ProgressBar(0, 100, TelegramBotBase.Controls.ProgressBar.eProgressStyle.standard);
|
Bar = new ProgressBar(0, 100, ProgressBar.eProgressStyle.standard);
|
||||||
Bar.Device = this.Device;
|
Bar.Device = this.Device;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "squares":
|
case "squares":
|
||||||
|
|
||||||
Bar = new TelegramBotBase.Controls.ProgressBar(0, 100, TelegramBotBase.Controls.ProgressBar.eProgressStyle.squares);
|
Bar = new ProgressBar(0, 100, ProgressBar.eProgressStyle.squares);
|
||||||
Bar.Device = this.Device;
|
Bar.Device = this.Device;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "circles":
|
case "circles":
|
||||||
|
|
||||||
Bar = new TelegramBotBase.Controls.ProgressBar(0, 100, TelegramBotBase.Controls.ProgressBar.eProgressStyle.circles);
|
Bar = new ProgressBar(0, 100, ProgressBar.eProgressStyle.circles);
|
||||||
Bar.Device = this.Device;
|
Bar.Device = this.Device;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "lines":
|
case "lines":
|
||||||
|
|
||||||
Bar = new TelegramBotBase.Controls.ProgressBar(0, 100, TelegramBotBase.Controls.ProgressBar.eProgressStyle.lines);
|
Bar = new ProgressBar(0, 100, ProgressBar.eProgressStyle.lines);
|
||||||
Bar.Device = this.Device;
|
Bar.Device = this.Device;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "squaredlines":
|
case "squaredlines":
|
||||||
|
|
||||||
Bar = new TelegramBotBase.Controls.ProgressBar(0, 100, TelegramBotBase.Controls.ProgressBar.eProgressStyle.squaredLines);
|
Bar = new ProgressBar(0, 100, ProgressBar.eProgressStyle.squaredLines);
|
||||||
Bar.Device = this.Device;
|
Bar.Device = this.Device;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "start":
|
case "start":
|
||||||
|
|
||||||
var sf = new Start();
|
var sf = new Menu();
|
||||||
|
|
||||||
await sf.Init();
|
|
||||||
|
|
||||||
await this.NavigateTo(sf);
|
await this.NavigateTo(sf);
|
||||||
|
|
||||||
@@ -89,14 +91,14 @@ namespace TelegramBaseTest.Tests
|
|||||||
|
|
||||||
|
|
||||||
//Render Progress bar and show some "example" progress
|
//Render Progress bar and show some "example" progress
|
||||||
await Bar.Render();
|
await Bar.Render(message);
|
||||||
|
|
||||||
this.Controls.Add(Bar);
|
this.Controls.Add(Bar);
|
||||||
|
|
||||||
for (int i = 0; i <= 100; i++)
|
for (int i = 0; i <= 100; i++)
|
||||||
{
|
{
|
||||||
Bar.Value++;
|
Bar.Value++;
|
||||||
await Bar.Render();
|
await Bar.Render(message);
|
||||||
|
|
||||||
Thread.Sleep(250);
|
Thread.Sleep(250);
|
||||||
}
|
}
|
||||||
@@ -119,17 +121,10 @@ namespace TelegramBaseTest.Tests
|
|||||||
await this.Device.Send("Choose your progress bar:", btn);
|
await this.Device.Send("Choose your progress bar:", btn);
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Closed()
|
private async Task ProgressTest_Closed(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
foreach (var b in this.Controls)
|
|
||||||
{
|
|
||||||
await b.Cleanup();
|
|
||||||
}
|
|
||||||
|
|
||||||
await this.Device.Send("Ciao from ProgressTest");
|
await this.Device.Send("Ciao from ProgressTest");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register
|
namespace TelegramBotBaseTest.Tests.Register
|
||||||
{
|
{
|
||||||
public class PerForm : AutoCleanForm
|
public class PerForm : AutoCleanForm
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register
|
namespace TelegramBotBaseTest.Tests.Register
|
||||||
{
|
{
|
||||||
public class PerStep: AutoCleanForm
|
public class PerStep: AutoCleanForm
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register
|
namespace TelegramBotBaseTest.Tests.Register
|
||||||
{
|
{
|
||||||
public class Start : AutoCleanForm
|
public class Start : AutoCleanForm
|
||||||
{
|
{
|
||||||
@@ -43,7 +43,7 @@ namespace TelegramBaseTest.Tests.Register
|
|||||||
break;
|
break;
|
||||||
case "backtodashboard":
|
case "backtodashboard":
|
||||||
|
|
||||||
var start = new Tests.Start();
|
var start = new Tests.Menu();
|
||||||
|
|
||||||
await this.NavigateTo(start);
|
await this.NavigateTo(start);
|
||||||
|
|
||||||
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register.Steps
|
namespace TelegramBotBaseTest.Tests.Register.Steps
|
||||||
{
|
{
|
||||||
public class Data
|
public class Data
|
||||||
{
|
{
|
||||||
@@ -3,20 +3,27 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Args;
|
||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register.Steps
|
namespace TelegramBotBaseTest.Tests.Register.Steps
|
||||||
{
|
{
|
||||||
public class Step1 : AutoCleanForm
|
public class Step1 : AutoCleanForm
|
||||||
{
|
{
|
||||||
public Data UserData { get; set; }
|
public Data UserData { get; set; }
|
||||||
|
|
||||||
public async override Task Init(params object[] args)
|
public Step1()
|
||||||
|
{
|
||||||
|
this.Init += Step1_Init;
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task Step1_Init(object sender, InitEventArgs e)
|
||||||
{
|
{
|
||||||
this.UserData = new Data();
|
this.UserData = new Data();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public async override Task Load(MessageResult message)
|
public async override Task Load(MessageResult message)
|
||||||
{
|
{
|
||||||
if (message.Handled)
|
if (message.Handled)
|
||||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register.Steps
|
namespace TelegramBotBaseTest.Tests.Register.Steps
|
||||||
{
|
{
|
||||||
public class Step2 : AutoCleanForm
|
public class Step2 : AutoCleanForm
|
||||||
{
|
{
|
||||||
@@ -6,7 +6,7 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests.Register.Steps
|
namespace TelegramBotBaseTest.Tests.Register.Steps
|
||||||
{
|
{
|
||||||
public class Step3 : AutoCleanForm
|
public class Step3 : AutoCleanForm
|
||||||
{
|
{
|
||||||
@@ -6,16 +6,23 @@ using System.Threading.Tasks;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests
|
namespace TelegramBotBaseTest.Tests
|
||||||
{
|
{
|
||||||
public class SimpleForm : FormBase
|
public class SimpleForm : AutoCleanForm
|
||||||
{
|
{
|
||||||
|
|
||||||
public override async Task Opened()
|
public SimpleForm()
|
||||||
{
|
{
|
||||||
await this.Device.Send("Hello world! (send 'back' to get back to Start)");
|
this.DeleteSide = TelegramBotBase.Enums.eDeleteSide.Both;
|
||||||
|
this.DeleteMode = TelegramBotBase.Enums.eDeleteMode.OnLeavingForm;
|
||||||
|
|
||||||
|
this.Opened += SimpleForm_Opened;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async Task SimpleForm_Opened(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
await this.Device.Send("Hello world! (send 'back' to get back to Start)\r\nOr\r\nhi, hello, maybe, bye and ciao");
|
||||||
|
}
|
||||||
|
|
||||||
public override async Task Load(MessageResult message)
|
public override async Task Load(MessageResult message)
|
||||||
{
|
{
|
||||||
@@ -48,9 +55,7 @@ namespace TelegramBaseTest.Tests
|
|||||||
|
|
||||||
case "back":
|
case "back":
|
||||||
|
|
||||||
var st = new Start();
|
var st = new Menu();
|
||||||
|
|
||||||
await st.Init();
|
|
||||||
|
|
||||||
await this.NavigateTo(st);
|
await this.NavigateTo(st);
|
||||||
|
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using TelegramBotBase.Base;
|
||||||
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
|
namespace TelegramBotBaseTest.Tests
|
||||||
|
{
|
||||||
|
public class Start : SplitterForm
|
||||||
|
{
|
||||||
|
public override async Task<bool> Open(MessageResult e)
|
||||||
|
{
|
||||||
|
var st = new Menu();
|
||||||
|
await this.NavigateTo(st);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public override async Task<bool> OpenGroup(MessageResult e)
|
||||||
|
{
|
||||||
|
var st = new Groups.LinkReplaceTest();
|
||||||
|
await this.NavigateTo(st);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> OpenChannel(MessageResult e)
|
||||||
|
{
|
||||||
|
return base.OpenChannel(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
public override Task<bool> OpenSupergroup(MessageResult e)
|
||||||
|
{
|
||||||
|
return base.OpenSupergroup(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -7,7 +7,7 @@ using Telegram.Bot.Types;
|
|||||||
using TelegramBotBase.Base;
|
using TelegramBotBase.Base;
|
||||||
using TelegramBotBase.Form;
|
using TelegramBotBase.Form;
|
||||||
|
|
||||||
namespace TelegramBaseTest.Tests
|
namespace TelegramBotBaseTest.Tests
|
||||||
{
|
{
|
||||||
public class TestForm : FormBase
|
public class TestForm : FormBase
|
||||||
{
|
{
|
||||||
@@ -15,27 +15,22 @@ namespace TelegramBaseTest.Tests
|
|||||||
|
|
||||||
String LastMessage { get; set; }
|
String LastMessage { get; set; }
|
||||||
|
|
||||||
public override async Task Init(params object[] param)
|
public TestForm()
|
||||||
{
|
{
|
||||||
|
this.Opened += TestForm_Opened;
|
||||||
|
this.Closed += TestForm_Closed;
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Opened()
|
private async Task TestForm_Opened(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
await this.Device.Send("Welcome to Form 1");
|
await this.Device.Send("Welcome to Form 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Closed()
|
private async Task TestForm_Closed(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
await this.Device.Send("Ciao from Form 1");
|
await this.Device.Send("Ciao from Form 1");
|
||||||
}
|
}
|
||||||
|
|
||||||
public override async Task Load(MessageResult message)
|
|
||||||
{
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public override async Task Action(MessageResult message)
|
public override async Task Action(MessageResult message)
|
||||||
{
|
{
|
||||||
@@ -44,25 +39,22 @@ namespace TelegramBaseTest.Tests
|
|||||||
case "reply":
|
case "reply":
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "navigate":
|
case "navigate":
|
||||||
|
|
||||||
var tf = new TestForm2();
|
var tf = new TestForm2();
|
||||||
|
|
||||||
await tf.Init();
|
|
||||||
|
|
||||||
await this.NavigateTo(tf);
|
await this.NavigateTo(tf);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
||||||
if (message.RawMessageData == null)
|
if (message.UpdateData == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.LastMessage = message.RawMessageData.Message.Text;
|
this.LastMessage = message.Message.Text;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||