I can say that isn’t true at all. I’m mainly C# developer and i’m focusing my knowledge on network protocols and yes i can say exists in fact an way to distinguish from an gracefully disconnect to network issue.
When user naturally decide to stop playing usually in all multiplayer games, they send an packet to server and tell to the server “hey, will stop play now” then server destroy everything that is owned by this player and repond to client “ok, i got you request”
Same for network issue, server usually keep receiving keepalive packets telling to the server “hello server, i’m still alive, don’t disconnect me” when usually you have some trouble in yout connect your game client stop sending these keepalive packets. That make server think “well maybe was an time desync or client just not playing anymore” at this point server keeps player data references in cache during some time before server consider that player was left to the game.
In overwatch the fact is after you disconnect from game, the server instantly predict that player decided to stop playing, in some match this isn’t exactly true, since WHEN you have lucky to reconnect (before waiting many hours untill Bnet stop blocking “Play” button saying that overwatch still executing even if isn’t) you can check your stats in match, everything is resetted.
About issues with server, yeah, exists many issues specially troubles in SA server (in location i play) also since yesterday, have now an maintenance that caused many players disconnected many times from every match, including me that triggered 19h of suspension.
When you pull off your network cable and in fact you have network connections everything is stored in windows logs and applications can track these network changes in realtime, if you put an invalid IPV4/IPV6 setting this is tracked by windows logs and also applications can track this in realtime, so ins’t “IMPOSSIBLE” to tell the difference between network failure or user itself.
About player hit X windows button or just press ALT+F4, every software can be cancelled to closing (and make windows prevent closing the program) the Windows in their C++ api call many finalizers for that program, also many online games dispatch functions to tell the server that uses decided to stop playing for his choice, like i said above, also this is tracked by overwatch, when you hit ALT+F4 this don’t make game close instantly, keeps running in background process finalizing many stuff and releasing system resources (that make BNet stuck on Play button disabled for some seconds).
Anyway, exists many things that devs can do to “tell difference” between an standard disconnection to user forcing that, so they did in lazy way, just punish player and is that.
Like in competitve matches, only stuff you need is just Win to keep increasing your rank. No matter if you did an amazing play, or has best player, if you Loose you rank will decay. That was an lazy way to determines how players will play.