* 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
In ASF V3.0 and before, we had a very naive mechanism with session handling that used to work fine but send a lot of requests as we always had to check session before sending a request.
Since ASF V3.1 until now we used new mechanism which refreshed session only when it indeed got invalidated, which worked good until now, but apparently due to some changed at Valve it stopped redirecting appropriately in all POST requests and non-/my GET/HEAD ones.
Therefore, implement hybrid session logic whick works V3.1+ for /my requests, and V3.0- for everything else.
* Initial bump to .NET Core 2.1
* Add workaround for https://github.com/mono/linker/issues/286
* Deprecate BackgroundGCPeriod
* Websockets updates
* Misc
* Check if travis works with 2.1
* Not yet
* Fix travis for now
* Test
* Whatever, travis is broken right now
* Schema update
* Update travis
* Test travis
* Check OSX
* Correct CI versions
* Misc
* Misc
This makes it possible to not only listen on multiple different host/port combinations, but also different protocols or base URLs (even though this will probably break things up, need to do more tests)