* Replace HAP with AngleSharp, add stream support to WebBrowser
* Fix skipped nullable operator
* Add extension method
* Rename function to be closer to HAP API
* Add JSON deserialization from stream, fix variable names, remove obsolete code
* Add more extension methods
* Fixes after review:
Remove excessive dependency
Move string value to const
Different handling for null and empty cases for confirmations
Use more human-friendly names
* Add http completion options, make GetToStream private
* Cleanup
* Add null checks, make StreamResponse disposable
* Refactor UrlGetToBinaryWithProgress into using UrlGetToStream
First important change is for all requests sent by ASF. Across those 4 years of development I do not remember a single situation where retrying on 4xx status code brought any improvement, bad request has to be handled by us, access denied and not found won't disappear after retry, all other ones are rather unused. Therefore, it makes sense to skip remaining tries on 4xx errors and do not flood the service with requests that are very unlikely to change anything.
Second change is smaller one and it allows the consumer of WebBrowser to declare that he's interested in handling client error codes himself. This way he can add extra logic and appropriately react to them - ASF uses it in statistics module, where the listing can signal refusal to list due to e.g. outdated ASF version through 403. Previously this was treated on the same level as timeout, which wasn't optimal.
* Implement basic plugin system
* The dawn of new era
* Add plugins warning
* Move more members to PublicAPI
* Open commands for the plugins
* Add IBotHackNewChat
* Run plugin events in parallel
* Use properties in IPlugin
* Hook our custom plugin into CI to ensure it compiles
* Fix dotnet brain damage
* Add IBotsComparer
* Add code documentation
* Add IBotTradeOffer
* Add IBotTradeOffer example
* Add IBotTradeOfferResults
* Final bulletproofing
* Final renaming