Status for Dolphin Central

Recent events

2017-09-25T07:45:33.343249	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:32.881126	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:32.878888	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 132, 'level': 'INFO', 'args': "('dolphin-emu', 'core-developers')", 'msg': 'Refreshing list of trusted users (from %s/%s)', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:12.046795	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 147, 'level': 'INFO', 'args': "('dolphin-emu/trusted-developers', 'leoetlino,LPFaint99,spxtr,kamiyo,Armada651,degasus,JMC47,NanoByte011,sepalani,linkmauve,Sonicadvance1,stenzek,EmptyChaos,aroulin,Ziek,Ryanel,RachelBryk,shuffle2,comex,LAGonauta,Sintendo,Aestek,Helios747,Buddybenj,Starsam80,magcius,magumagu,Zopieux,mathieui,FioraAeterna,iwubcode,glennricster,JosJuice,delroth,lioncash,Tinob,rukai,aldelaro5,Tilka,meffij,AdmiralCurtiss,BhaaLseN,vladfi1,Parlane,Alcaro,mmastrac,Orphis,jezze,ligfx,skidau,moncefmechri,randomstuff,OrN,JonnyH,adamdmoss,PEmu1,bentley,neobrain,absolome,kayru,endrift,cylgom,Stevoisiak,spycrab,unknownbrackets,marcan,jordan-woyak,RisingFog,SeannyM,mahdihijazi,booto,clinchergt,phire,hthh,hrydgard,galop1n,MerryMage,jloehr,MayImilae,hdcmeta,mrgreywater,Phatcat,archshift,rohit-n,Linktothepast,sigmabeta,mimimi085181')", 'msg': 'New GH %s: %s', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:11.487656	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:10.968883	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:10.419603	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:09.983107	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:09.981078	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 132, 'level': 'INFO', 'args': "('dolphin-emu', 'trusted-developers')", 'msg': 'Refreshing list of trusted users (from %s/%s)', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.665346	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.664460	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/gcdsp-ida' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.200983	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.720543	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.718361	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/hwtests' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.244173	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.757532	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.755295	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/www' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.231813	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.746006	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.743656	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/sadm' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.226085	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.711843	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.709628	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/redmine' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.208687	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:06.700204	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}

Recent 'build_status' events

2017-09-24T22:39:07.650606	{'service': 'pr-win-dbg-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-win-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:37:16.172279	{'service': 'pr-deb-dbg-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/660', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-deb-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:36:34.767120	{'service': 'pr-win-dbg-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-win-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:36:34.281596	{'service': 'pr-win-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/662', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-win-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:35:42.516088	{'service': 'pr-android', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/668', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-android', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:34:56.587795	{'service': 'pr-osx-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/659', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-osx-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:34:29.012704	{'service': 'pr-deb-dbg-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/660', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-deb-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:34:27.388832	{'service': 'pr-deb-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-deb-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:33:25.218987	{'service': 'pr-android', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/668', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-android', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:33:24.611035	{'service': 'pr-ubu-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/668', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-ubu-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:32:26.167704	{'service': 'pr-freebsd-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build succeeded on builder pr-freebsd-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:37.900058	{'service': 'pr-ubu-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/668', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-ubu-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:37.419977	{'service': 'lint', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/660', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Build failed on builder lint', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:33.604572	{'service': 'pr-freebsd-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-freebsd-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:33.116323	{'service': 'pr-win-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/662', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-win-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:32.539115	{'service': 'lint', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/660', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder lint', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:31.892385	{'service': 'pr-deb-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/661', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-deb-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:31.284952	{'service': 'pr-osx-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/659', 'source': 'buildbot', 'shortrev': '491255', 'description': 'Auto build in progress on builder pr-osx-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T22:31:24.104396	{'service': 'default', 'pr': 6075, 'success': True, 'url': '', 'source': 'prbuilder', 'shortrev': '491255', 'description': 'Very basic checks passed, handed off to Buildbot.', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'build_status'}
2017-09-24T20:50:12.468366	{'service': 'pr-win-dbg-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/660', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Build succeeded on builder pr-win-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}
2017-09-24T20:48:00.214737	{'service': 'pr-win-dbg-x64', 'pr': 6075, 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/660', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Auto build in progress on builder pr-win-dbg-x64', 'pending': True, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}
2017-09-24T20:47:59.641716	{'service': 'pr-win-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/661', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Build succeeded on builder pr-win-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}
2017-09-24T20:47:10.020927	{'service': 'pr-osx-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/658', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Build succeeded on builder pr-osx-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}
2017-09-24T20:47:07.303087	{'service': 'pr-deb-dbg-x64', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/659', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Build succeeded on builder pr-deb-dbg-x64', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}
2017-09-24T20:46:21.753287	{'service': 'pr-android', 'pr': 6075, 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/667', 'source': 'buildbot', 'shortrev': 'a0fe55', 'description': 'Build succeeded on builder pr-android', 'pending': False, 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'build_status'}

Recent 'gh_commit_comment' events

2017-09-04T17:19:57.003926	{'author': 'sardaukar', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2e8bc0fa07d9b1b1a7eee6d14d135de829b14711#commitcomment-24075593', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2e8bc0fa07d9b1b1a7eee6d14d135de829b14711'}
2017-08-07T17:49:45.998345	{'author': 'ligfx', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2abf13ae3676be45494cf354d6453bfce340c454#commitcomment-23519246', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2abf13ae3676be45494cf354d6453bfce340c454'}
2017-08-07T16:46:10.795624	{'author': 'ligfx', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2abf13ae3676be45494cf354d6453bfce340c454#commitcomment-23518233', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2abf13ae3676be45494cf354d6453bfce340c454'}
2017-08-07T16:43:25.182100	{'author': 'ligfx', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2abf13ae3676be45494cf354d6453bfce340c454#commitcomment-23518194', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2abf13ae3676be45494cf354d6453bfce340c454'}
2017-08-07T15:45:39.313312	{'author': 'crackwitz', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2abf13ae3676be45494cf354d6453bfce340c454#commitcomment-23517211', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2abf13ae3676be45494cf354d6453bfce340c454'}
2017-08-07T15:42:29.244070	{'author': 'crackwitz', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/2abf13ae3676be45494cf354d6453bfce340c454#commitcomment-23517147', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': '2abf13ae3676be45494cf354d6453bfce340c454'}
2017-07-30T02:46:20.119382	{'author': 'theboy181', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/a32fe86eef4fb345faacfe29e29a2cca64968d06#commitcomment-23375153', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': 'a32fe86eef4fb345faacfe29e29a2cca64968d06'}
2017-07-20T05:32:19.512592	{'author': 'leoetlino', 'source': 'ghhookparser', 'url': 'https://github.com/dolphin-emu/dolphin/commit/db1c534b3ecddf23ad57b03c80b74de55466b062#commitcomment-23195967', 'repo': 'dolphin-emu/dolphin', 'type': 'gh_commit_comment', 'commit': 'db1c534b3ecddf23ad57b03c80b74de55466b062'}

Recent 'gh_issue_comment' events

2017-09-24T20:35:51.395335	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331738455', 'id': 6077, 'source': 'ghhookparser', 'author': 'delroth', 'body': 'LGTM. If LLE works with that JIT change, feel free to merge.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'milestone': None, 'locked': False, 'id': 258942998, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/comments', 'assignees': [], 'created_at': '2017-09-19T19:51:06Z', 'body': 'A collection of small DSP accelerator fixes. Each commit is self contained and changes are explained in their respective commit messages.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 6077, 'assignee': None, 'comments': 6, 'updated_at': '2017-09-24T20:35:50Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}, 'author_association': 'MEMBER', 'labels': [], 'title': 'Small DSP accelerator fixes'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'created_at': '2017-09-24T20:35:50Z', 'user': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'updated_at': '2017-09-24T20:35:50Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331738455', 'body': 'LGTM. If LLE works with that JIT change, feel free to merge.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331738455', 'id': 331738455, 'author_association': 'OWNER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3697, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T18:48:59Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T17:36:05Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3697, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3697, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Small DSP accelerator fixes'}
2017-09-24T16:45:21.657580	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331722682', 'id': 6077, 'source': 'ghhookparser', 'author': 'JMC47', 'body': "All of the cases appear to be working now and Disney Magical Park isn't broken any more.\r\n\r\nI'm sad it isn't broken anymore because it was amazing, but, I guess it's better not to have known regressions when merging things.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'milestone': None, 'locked': False, 'id': 258942998, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/comments', 'assignees': [], 'created_at': '2017-09-19T19:51:06Z', 'body': 'A collection of small DSP accelerator fixes. Each commit is self contained and changes are explained in their respective commit messages.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 6077, 'assignee': None, 'comments': 5, 'updated_at': '2017-09-24T16:45:20Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}, 'author_association': 'MEMBER', 'labels': [], 'title': 'Small DSP accelerator fixes'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'created_at': '2017-09-24T16:45:20Z', 'user': {'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'url': 'https://api.github.com/users/JMC47', 'gravatar_id': '', 'html_url': 'https://github.com/JMC47', 'id': 6598209, 'repos_url': 'https://api.github.com/users/JMC47/repos', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'login': 'JMC47', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'followers_url': 'https://api.github.com/users/JMC47/followers', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'type': 'User'}, 'updated_at': '2017-09-24T16:45:20Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331722682', 'body': "All of the cases appear to be working now and Disney Magical Park isn't broken any more.\r\n\r\nI'm sad it isn't broken anymore because it was amazing, but, I guess it's better not to have known regressions when merging things.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331722682', 'id': 331722682, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T15:28:53Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T05:32:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Small DSP accelerator fixes'}
2017-09-24T10:41:38.876817	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331701551', 'id': 6077, 'source': 'ghhookparser', 'author': 'skidau', 'body': 'To fix the Windows build issue, add stubs to DSPHost.* and possibly remove the #include from DSPAccelerator.cpp.  Take a look at 6a6c086b502290de80f51e07c282070b5122f524 to base the changes.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/skidau/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/8612259?v=4', 'url': 'https://api.github.com/users/skidau', 'gravatar_id': '', 'html_url': 'https://github.com/skidau', 'id': 8612259, 'repos_url': 'https://api.github.com/users/skidau/repos', 'events_url': 'https://api.github.com/users/skidau/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/skidau/subscriptions', 'starred_url': 'https://api.github.com/users/skidau/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/skidau/following{/other_user}', 'login': 'skidau', 'received_events_url': 'https://api.github.com/users/skidau/received_events', 'followers_url': 'https://api.github.com/users/skidau/followers', 'organizations_url': 'https://api.github.com/users/skidau/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'milestone': None, 'locked': False, 'id': 258942998, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/comments', 'assignees': [], 'created_at': '2017-09-19T19:51:06Z', 'body': 'A collection of small DSP accelerator fixes. Each commit is self contained and changes are explained in their respective commit messages.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 6077, 'assignee': None, 'comments': 4, 'updated_at': '2017-09-24T10:41:38Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}, 'author_association': 'MEMBER', 'labels': [], 'title': 'Small DSP accelerator fixes'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'created_at': '2017-09-24T10:41:38Z', 'user': {'gists_url': 'https://api.github.com/users/skidau/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/8612259?v=4', 'url': 'https://api.github.com/users/skidau', 'gravatar_id': '', 'html_url': 'https://github.com/skidau', 'id': 8612259, 'repos_url': 'https://api.github.com/users/skidau/repos', 'events_url': 'https://api.github.com/users/skidau/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/skidau/subscriptions', 'starred_url': 'https://api.github.com/users/skidau/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/skidau/following{/other_user}', 'login': 'skidau', 'received_events_url': 'https://api.github.com/users/skidau/received_events', 'followers_url': 'https://api.github.com/users/skidau/followers', 'organizations_url': 'https://api.github.com/users/skidau/orgs', 'type': 'User'}, 'updated_at': '2017-09-24T10:41:38Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331701551', 'body': 'To fix the Windows build issue, add stubs to DSPHost.* and possibly remove the #include from DSPAccelerator.cpp.  Take a look at 6a6c086b502290de80f51e07c282070b5122f524 to base the changes.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331701551', 'id': 331701551, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T09:34:48Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T05:32:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Small DSP accelerator fixes'}
2017-09-24T09:43:47.892427	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331698919', 'id': 6077, 'source': 'ghhookparser', 'author': 'leoetlino', 'body': "Fixed the regression. The Windows build failure should be unrelated; it's trying to rebuild DSPTool (because I edited DSP header files), but that fails when linking for some reason :/\r\n\r\n@delroth would you mind giving this another review?", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'milestone': None, 'locked': False, 'id': 258942998, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/comments', 'assignees': [], 'created_at': '2017-09-19T19:51:06Z', 'body': 'A collection of small DSP accelerator fixes. Each commit is self contained and changes are explained in their respective commit messages.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 6077, 'assignee': None, 'comments': 3, 'updated_at': '2017-09-24T09:43:47Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}, 'author_association': 'MEMBER', 'labels': [], 'title': 'Small DSP accelerator fixes'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'created_at': '2017-09-24T09:43:47Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'updated_at': '2017-09-24T09:43:47Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331698919', 'body': "Fixed the regression. The Windows build failure should be unrelated; it's trying to rebuild DSPTool (because I edited DSP header files), but that fails when linking for some reason :/\r\n\r\n@delroth would you mind giving this another review?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331698919', 'id': 331698919, 'author_association': 'MEMBER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T09:34:48Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T05:32:18Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Small DSP accelerator fixes'}
2017-09-22T20:19:57.361423	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331550827', 'id': 6077, 'source': 'ghhookparser', 'author': 'leoetlino', 'body': "Converted the accelerator code into a C++ class (as mentioned on IRC), and rebased all other patches.\r\n\r\nUnfortunately, I'm still unable to figure out the regression in the Disney game... It's kind of weird that it breaks only with AX HLE... So for now, the WIP tag should be kept.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'milestone': None, 'locked': False, 'id': 258942998, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/comments', 'assignees': [], 'created_at': '2017-09-19T19:51:06Z', 'body': 'A collection of small DSP accelerator fixes. Each commit is self contained and changes are explained in their respective commit messages.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'number': 6077, 'assignee': None, 'comments': 3, 'updated_at': '2017-09-22T20:19:56Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6077.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}, 'author_association': 'MEMBER', 'labels': [{'color': '0052cc', 'name': 'WIP', 'id': 221808232, 'default': False, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels/WIP'}], 'title': 'Small DSP accelerator fixes'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6077', 'created_at': '2017-09-22T20:19:56Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'updated_at': '2017-09-22T20:19:56Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331550827', 'body': "Converted the accelerator code into a C++ class (as mentioned on IRC), and rebased all other patches.\r\n\r\nUnfortunately, I'm still unable to figure out the regression in the Disney game... It's kind of weird that it breaks only with AX HLE... So for now, the WIP tag should be kept.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#issuecomment-331550827', 'id': 331550827, 'author_association': 'MEMBER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3693, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-22T20:16:27Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-22T05:50:57Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3693, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3693, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Small DSP accelerator fixes'}
2017-09-22T14:32:06.321708	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331463760', 'id': 6084, 'source': 'ghhookparser', 'author': 'JosJuice', 'body': 'The guidelines say 16dp, yes. I also checked the Gmail app that was mentioned in the forum topic, and it places the button in the same place on my phone as Dolphin does after this PR.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'milestone': None, 'locked': False, 'id': 259504417, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/comments', 'assignees': [], 'created_at': '2017-09-21T13:53:50Z', 'body': 'I cherry-picked this from PR #5281 because it was requested by https://forums.dolphin-emu.org/Thread-misplaced-floating-action-button\r\n\r\nBefore:\r\n![screenshot_20170921-154608](https://user-images.githubusercontent.com/6716818/30699401-ec2dc950-9ee4-11e7-9ca7-b7eff7ebeb48.png)\r\n\r\nAfter:\r\n![screenshot_20170921-155027](https://user-images.githubusercontent.com/6716818/30699408-f0a3598c-9ee4-11e7-8711-89fff5f59cd3.png)', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/events', 'closed_at': '2017-09-22T06:42:22Z', 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'number': 6084, 'assignee': None, 'comments': 3, 'updated_at': '2017-09-22T14:32:05Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6084'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Android: Adjust position of floating action button'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'created_at': '2017-09-22T14:32:05Z', 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'updated_at': '2017-09-22T14:32:05Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331463760', 'body': 'The guidelines say 16dp, yes. I also checked the Gmail app that was mentioned in the forum topic, and it places the button in the same place on my phone as Dolphin does after this PR.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331463760', 'id': 331463760, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3693, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-22T06:42:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-22T05:50:57Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 134, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348880, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 134, 'stargazers_count': 3693, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3693, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Android: Adjust position of floating action button'}
2017-09-22T06:42:19.442475	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331364068', 'id': 6084, 'source': 'ghhookparser', 'author': 'degasus', 'body': "I think so. Let's just merge it.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/degasus/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/2787141?v=4', 'url': 'https://api.github.com/users/degasus', 'gravatar_id': '', 'html_url': 'https://github.com/degasus', 'id': 2787141, 'repos_url': 'https://api.github.com/users/degasus/repos', 'events_url': 'https://api.github.com/users/degasus/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/degasus/subscriptions', 'starred_url': 'https://api.github.com/users/degasus/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/degasus/following{/other_user}', 'login': 'degasus', 'received_events_url': 'https://api.github.com/users/degasus/received_events', 'followers_url': 'https://api.github.com/users/degasus/followers', 'organizations_url': 'https://api.github.com/users/degasus/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'milestone': None, 'locked': False, 'id': 259504417, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/comments', 'assignees': [], 'created_at': '2017-09-21T13:53:50Z', 'body': 'I cherry-picked this from PR #5281 because it was requested by https://forums.dolphin-emu.org/Thread-misplaced-floating-action-button\r\n\r\nBefore:\r\n![screenshot_20170921-154608](https://user-images.githubusercontent.com/6716818/30699401-ec2dc950-9ee4-11e7-9ca7-b7eff7ebeb48.png)\r\n\r\nAfter:\r\n![screenshot_20170921-155027](https://user-images.githubusercontent.com/6716818/30699408-f0a3598c-9ee4-11e7-8711-89fff5f59cd3.png)', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'number': 6084, 'assignee': None, 'comments': 2, 'updated_at': '2017-09-22T06:42:18Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6084'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Android: Adjust position of floating action button'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'created_at': '2017-09-22T06:42:18Z', 'user': {'gists_url': 'https://api.github.com/users/degasus/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/2787141?v=4', 'url': 'https://api.github.com/users/degasus', 'gravatar_id': '', 'html_url': 'https://github.com/degasus', 'id': 2787141, 'repos_url': 'https://api.github.com/users/degasus/repos', 'events_url': 'https://api.github.com/users/degasus/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/degasus/subscriptions', 'starred_url': 'https://api.github.com/users/degasus/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/degasus/following{/other_user}', 'login': 'degasus', 'received_events_url': 'https://api.github.com/users/degasus/received_events', 'followers_url': 'https://api.github.com/users/degasus/followers', 'organizations_url': 'https://api.github.com/users/degasus/orgs', 'type': 'User'}, 'updated_at': '2017-09-22T06:42:18Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331364068', 'body': "I think so. Let's just merge it.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331364068', 'id': 331364068, 'author_association': 'MEMBER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3693, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:29:25Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-22T05:50:57Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 135, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348885, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 135, 'stargazers_count': 3693, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3693, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Android: Adjust position of floating action button'}
2017-09-21T22:40:30.497858	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331301510', 'id': 6084, 'source': 'ghhookparser', 'author': 'mbc07', 'body': "So, does this new placement matches the Material Design guidelines? Otherwise I'm pretty sure someone else will open another PR in future and the cat and mouse game will resume...", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/8005966?v=4', 'url': 'https://api.github.com/users/mbc07', 'gravatar_id': '', 'html_url': 'https://github.com/mbc07', 'id': 8005966, 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'login': 'mbc07', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'milestone': None, 'locked': False, 'id': 259504417, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/comments', 'assignees': [], 'created_at': '2017-09-21T13:53:50Z', 'body': 'I cherry-picked this from PR #5281 because it was requested by https://forums.dolphin-emu.org/Thread-misplaced-floating-action-button\r\n\r\nBefore:\r\n![screenshot_20170921-154608](https://user-images.githubusercontent.com/6716818/30699401-ec2dc950-9ee4-11e7-9ca7-b7eff7ebeb48.png)\r\n\r\nAfter:\r\n![screenshot_20170921-155027](https://user-images.githubusercontent.com/6716818/30699408-f0a3598c-9ee4-11e7-8711-89fff5f59cd3.png)', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'number': 6084, 'assignee': None, 'comments': 1, 'updated_at': '2017-09-21T22:40:29Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6084'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Android: Adjust position of floating action button'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'created_at': '2017-09-21T22:40:29Z', 'user': {'gists_url': 'https://api.github.com/users/mbc07/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/8005966?v=4', 'url': 'https://api.github.com/users/mbc07', 'gravatar_id': '', 'html_url': 'https://github.com/mbc07', 'id': 8005966, 'repos_url': 'https://api.github.com/users/mbc07/repos', 'events_url': 'https://api.github.com/users/mbc07/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mbc07/subscriptions', 'starred_url': 'https://api.github.com/users/mbc07/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mbc07/following{/other_user}', 'login': 'mbc07', 'received_events_url': 'https://api.github.com/users/mbc07/received_events', 'followers_url': 'https://api.github.com/users/mbc07/followers', 'organizations_url': 'https://api.github.com/users/mbc07/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T22:40:29Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331301510', 'body': "So, does this new placement matches the Material Design guidelines? Otherwise I'm pretty sure someone else will open another PR in future and the cat and mouse game will resume...", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331301510', 'id': 331301510, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:29:25Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-21T17:30:16Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 135, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348885, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 135, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Android: Adjust position of floating action button'}
2017-09-21T17:37:44.773402	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331228581', 'id': 6084, 'source': 'ghhookparser', 'author': 'degasus', 'body': "I need some fifoci way to compare those screenshots....\r\nBut whatever, I'm fine with both locations.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/degasus/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/2787141?v=4', 'url': 'https://api.github.com/users/degasus', 'gravatar_id': '', 'html_url': 'https://github.com/degasus', 'id': 2787141, 'repos_url': 'https://api.github.com/users/degasus/repos', 'events_url': 'https://api.github.com/users/degasus/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/degasus/subscriptions', 'starred_url': 'https://api.github.com/users/degasus/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/degasus/following{/other_user}', 'login': 'degasus', 'received_events_url': 'https://api.github.com/users/degasus/received_events', 'followers_url': 'https://api.github.com/users/degasus/followers', 'organizations_url': 'https://api.github.com/users/degasus/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'milestone': None, 'locked': False, 'id': 259504417, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/comments', 'assignees': [], 'created_at': '2017-09-21T13:53:50Z', 'body': 'I cherry-picked this from PR #5281 because it was requested by https://forums.dolphin-emu.org/Thread-misplaced-floating-action-button\r\n\r\nBefore:\r\n![screenshot_20170921-154608](https://user-images.githubusercontent.com/6716818/30699401-ec2dc950-9ee4-11e7-9ca7-b7eff7ebeb48.png)\r\n\r\nAfter:\r\n![screenshot_20170921-155027](https://user-images.githubusercontent.com/6716818/30699408-f0a3598c-9ee4-11e7-8711-89fff5f59cd3.png)', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'number': 6084, 'assignee': None, 'comments': 0, 'updated_at': '2017-09-21T17:37:43Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6084.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6084'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Android: Adjust position of floating action button'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6084', 'created_at': '2017-09-21T17:37:43Z', 'user': {'gists_url': 'https://api.github.com/users/degasus/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/2787141?v=4', 'url': 'https://api.github.com/users/degasus', 'gravatar_id': '', 'html_url': 'https://github.com/degasus', 'id': 2787141, 'repos_url': 'https://api.github.com/users/degasus/repos', 'events_url': 'https://api.github.com/users/degasus/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/degasus/subscriptions', 'starred_url': 'https://api.github.com/users/degasus/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/degasus/following{/other_user}', 'login': 'degasus', 'received_events_url': 'https://api.github.com/users/degasus/received_events', 'followers_url': 'https://api.github.com/users/degasus/followers', 'organizations_url': 'https://api.github.com/users/degasus/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T17:37:43Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331228581', 'body': "I need some fifoci way to compare those screenshots....\r\nBut whatever, I'm fine with both locations.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6084#issuecomment-331228581', 'id': 331228581, 'author_association': 'MEMBER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:29:25Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-21T17:30:16Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 135, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348885, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 135, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Android: Adjust position of floating action button'}
2017-09-21T16:51:42.163396	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5920#issuecomment-331216641', 'id': 5920, 'source': 'ghhookparser', 'author': 'mimimi085181', 'body': "This pr is blocked by the regressions that the tmem cache pr caused. As long as those are not handled, it's pointless trying to do anything about performance.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5920', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5920/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5920', 'milestone': None, 'locked': False, 'id': 249800145, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5920/comments', 'assignees': [], 'created_at': '2017-08-12T09:18:51Z', 'body': "This is just the optimisation that was ripped out of the original tmem pr from phire: https://github.com/dolphin-emu/dolphin/pull/3749\r\n\r\nI'm curious, if it just works like that.\r\n\r\nPS: Somebody should check, if i did the bitset stuff right.", 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5920/events', 'closed_at': '2017-09-21T16:51:41Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'number': 5920, 'assignee': None, 'comments': 6, 'updated_at': '2017-09-21T16:51:41Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5920.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5920', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5920.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5920'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Optimise tmem cache emulation'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5920', 'created_at': '2017-09-21T16:51:41Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T16:51:41Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331216641', 'body': "This pr is blocked by the regressions that the tmem cache pr caused. As long as those are not handled, it's pointless trying to do anything about performance.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5920#issuecomment-331216641', 'id': 331216641, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3690, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:29:25Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-21T16:40:14Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 135, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348885, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 135, 'stargazers_count': 3690, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3690, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Optimise tmem cache emulation'}
2017-09-21T16:49:52.305679	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5971#issuecomment-331216189', 'id': 5971, 'source': 'ghhookparser', 'author': 'mimimi085181', 'body': "Forgot to close this. After talking to phire i don't think this is the proper way of handling the issue, sorry.\r\n\r\nI guess in order to fix the regression the tmem cache pr needs to be reverted until someone implements a proper solution.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5971', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5971/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5971', 'milestone': None, 'locked': False, 'id': 252412759, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5971/comments', 'assignees': [], 'created_at': '2017-08-23T20:53:05Z', 'body': "This fixes issue #10467:\r\nhttps://bugs.dolphin-emu.org/issues/10467\r\n\r\nNeeds a proper review, because i got to that register by guesswork. And it's also just guesswork that the issue should be fixed by invalidating the tmem cache on a bpmem register.\r\n\r\nThe registers that are used between the problemantic efb copies, which are all at the same offset, but have a different source position:\r\nBPMEM_TEV_KSEL\r\nBPMEM_COPYFILTER0\r\nBPMEM_COPYFILTER1\r\nBPMEM_BLENDMODE\r\nBPMEM_EFB_TL\r\nBPMEM_TRIGGER_EFB_COPY\r\n\r\nSince it makes sense that an efb copy from another source position can't be identical to another, i chose BPMEM_EFB_TL, which changes top/left of the efb copy source rectangle. Hopefully that's the reason why the tmem cache is invalidated on hardware also.\r\n\r\nWell, i guess the pr could also be merged without a proper review, because now it just caches less stuff, it fixes the issue and spyro still works. The tmem caching is only important for spyro a hero's tail, the performance gains are just a bonus.", 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5971/events', 'closed_at': '2017-09-21T16:49:51Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'number': 5971, 'assignee': None, 'comments': 4, 'updated_at': '2017-09-21T16:49:51Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5971.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5971', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5971.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5971'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Invalidate the tmem cache on BPMEM_EFB_TL'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5971', 'created_at': '2017-09-21T16:49:51Z', 'user': {'gists_url': 'https://api.github.com/users/mimimi085181/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/9304938?v=4', 'url': 'https://api.github.com/users/mimimi085181', 'gravatar_id': '', 'html_url': 'https://github.com/mimimi085181', 'id': 9304938, 'repos_url': 'https://api.github.com/users/mimimi085181/repos', 'events_url': 'https://api.github.com/users/mimimi085181/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/mimimi085181/subscriptions', 'starred_url': 'https://api.github.com/users/mimimi085181/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/mimimi085181/following{/other_user}', 'login': 'mimimi085181', 'received_events_url': 'https://api.github.com/users/mimimi085181/received_events', 'followers_url': 'https://api.github.com/users/mimimi085181/followers', 'organizations_url': 'https://api.github.com/users/mimimi085181/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T16:49:51Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331216189', 'body': "Forgot to close this. After talking to phire i don't think this is the proper way of handling the issue, sorry.\r\n\r\nI guess in order to fix the regression the tmem cache pr needs to be reverted until someone implements a proper solution.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5971#issuecomment-331216189', 'id': 331216189, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3690, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:29:25Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-21T16:40:14Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 136, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348885, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 136, 'stargazers_count': 3690, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3690, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Invalidate the tmem cache on BPMEM_EFB_TL'}
2017-09-21T15:29:01.631398	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6081#issuecomment-331192855', 'id': 6081, 'source': 'ghhookparser', 'author': 'leoetlino', 'body': 'LGTM, just needs a rebase', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6081', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6081/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6081', 'milestone': None, 'locked': False, 'id': 259228501, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6081/comments', 'assignees': [], 'created_at': '2017-09-20T16:39:01Z', 'body': 'EmulationStateChanged is functionally correct right now, but ConfigChanged expresses more semantically why the config setting gets re-read and the widgets updated.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6081/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'number': 6081, 'assignee': None, 'comments': 2, 'updated_at': '2017-09-21T15:29:00Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6081.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6081', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6081.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6081'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Qt: bold graphics settings on ConfigChanged, not EmulationStateChanged'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6081', 'created_at': '2017-09-21T15:29:00Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T15:29:00Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331192855', 'body': 'LGTM, just needs a rebase', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6081#issuecomment-331192855', 'id': 331192855, 'author_association': 'MEMBER'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T15:27:42Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 138, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 138, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Qt: bold graphics settings on ConfigChanged, not EmulationStateChanged'}
2017-09-21T13:58:47.202530	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 5281, 'source': 'ghhookparser', 'author': 'JosJuice', 'body': "Since this PR won't get merged in its current state and the branch that it's based on seems to have been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs (rather than having a bunch of different changes in one PR). I've already split out the FAB placement change to PR #6084.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'changes': {'body': {'from': "Since this PR won't get merged in its current state and the branch that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement."}}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'created_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T13:58:46Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331164075', 'body': "Since this PR won't get merged in its current state and the branch that it's based on seems to have been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs (rather than having a bunch of different changes in one PR). I've already split out the FAB placement change to PR #6084.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 331164075, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T13:53:51Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'milestone': None, 'locked': False, 'id': 222036749, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/comments', 'assignees': [], 'created_at': '2017-04-16T22:15:32Z', 'body': '- The Floating Action Button was set to be 32dp instead of the common 16dp.\r\n- Added padding in the MainActivity Toolbar to make it look (in my opinion) cleaner.\r\n- Changed Floating Action Button style from "auto" to "normal".\r\n- Changed buildToolsVersion in app build.gradle from 25.0.2 to 25.0.1, as this was causing an error stating that AIDL was missing\r\n- Uncommented some cmake build.gradle lines to allow the project to be ran on a physical device\r\n- Changed Video Settings icon to something more obvious (https://material.io/icons/#ic_tv)\r\n- Changed theme from DolphinGamecube to DolphinBase\r\n\r\nBefore and after: http://imgur.com/a/Oeukv', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/events', 'closed_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/sonic2kk/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/7917345?v=4', 'url': 'https://api.github.com/users/sonic2kk', 'gravatar_id': '', 'html_url': 'https://github.com/sonic2kk', 'id': 7917345, 'repos_url': 'https://api.github.com/users/sonic2kk/repos', 'events_url': 'https://api.github.com/users/sonic2kk/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sonic2kk/subscriptions', 'starred_url': 'https://api.github.com/users/sonic2kk/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sonic2kk/following{/other_user}', 'login': 'sonic2kk', 'received_events_url': 'https://api.github.com/users/sonic2kk/received_events', 'followers_url': 'https://api.github.com/users/sonic2kk/followers', 'organizations_url': 'https://api.github.com/users/sonic2kk/orgs', 'type': 'User'}, 'number': 5281, 'assignee': None, 'comments': 9, 'updated_at': '2017-09-21T13:58:46Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5281'}, 'author_association': 'NONE', 'labels': [], 'title': 'Android: Changed FAB Placement and Video Settings Icon'}}, 'type': 'gh_issue_comment', 'title': 'Android: Changed FAB Placement and Video Settings Icon'}
2017-09-21T13:57:12.385567	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 5281, 'source': 'ghhookparser', 'author': 'JosJuice', 'body': "Since this PR won't get merged in its current state and the branch that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'changes': {'body': {'from': "Since this PR won't get merged in its current state and the repository that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement."}}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'created_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T13:57:11Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331164075', 'body': "Since this PR won't get merged in its current state and the branch that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 331164075, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T13:53:51Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'milestone': None, 'locked': False, 'id': 222036749, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/comments', 'assignees': [], 'created_at': '2017-04-16T22:15:32Z', 'body': '- The Floating Action Button was set to be 32dp instead of the common 16dp.\r\n- Added padding in the MainActivity Toolbar to make it look (in my opinion) cleaner.\r\n- Changed Floating Action Button style from "auto" to "normal".\r\n- Changed buildToolsVersion in app build.gradle from 25.0.2 to 25.0.1, as this was causing an error stating that AIDL was missing\r\n- Uncommented some cmake build.gradle lines to allow the project to be ran on a physical device\r\n- Changed Video Settings icon to something more obvious (https://material.io/icons/#ic_tv)\r\n- Changed theme from DolphinGamecube to DolphinBase\r\n\r\nBefore and after: http://imgur.com/a/Oeukv', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/events', 'closed_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/sonic2kk/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/7917345?v=4', 'url': 'https://api.github.com/users/sonic2kk', 'gravatar_id': '', 'html_url': 'https://github.com/sonic2kk', 'id': 7917345, 'repos_url': 'https://api.github.com/users/sonic2kk/repos', 'events_url': 'https://api.github.com/users/sonic2kk/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sonic2kk/subscriptions', 'starred_url': 'https://api.github.com/users/sonic2kk/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sonic2kk/following{/other_user}', 'login': 'sonic2kk', 'received_events_url': 'https://api.github.com/users/sonic2kk/received_events', 'followers_url': 'https://api.github.com/users/sonic2kk/followers', 'organizations_url': 'https://api.github.com/users/sonic2kk/orgs', 'type': 'User'}, 'number': 5281, 'assignee': None, 'comments': 9, 'updated_at': '2017-09-21T13:57:11Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5281'}, 'author_association': 'NONE', 'labels': [], 'title': 'Android: Changed FAB Placement and Video Settings Icon'}}, 'type': 'gh_issue_comment', 'title': 'Android: Changed FAB Placement and Video Settings Icon'}
2017-09-21T13:56:13.277917	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 5281, 'source': 'ghhookparser', 'author': 'JosJuice', 'body': "Since this PR won't get merged in its current state and the repository that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'milestone': None, 'locked': False, 'id': 222036749, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/comments', 'assignees': [], 'created_at': '2017-04-16T22:15:32Z', 'body': '- The Floating Action Button was set to be 32dp instead of the common 16dp.\r\n- Added padding in the MainActivity Toolbar to make it look (in my opinion) cleaner.\r\n- Changed Floating Action Button style from "auto" to "normal".\r\n- Changed buildToolsVersion in app build.gradle from 25.0.2 to 25.0.1, as this was causing an error stating that AIDL was missing\r\n- Uncommented some cmake build.gradle lines to allow the project to be ran on a physical device\r\n- Changed Video Settings icon to something more obvious (https://material.io/icons/#ic_tv)\r\n- Changed theme from DolphinGamecube to DolphinBase\r\n\r\nBefore and after: http://imgur.com/a/Oeukv', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281/events', 'closed_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/sonic2kk/gists{/gist_id}', 'avatar_url': 'https://avatars3.githubusercontent.com/u/7917345?v=4', 'url': 'https://api.github.com/users/sonic2kk', 'gravatar_id': '', 'html_url': 'https://github.com/sonic2kk', 'id': 7917345, 'repos_url': 'https://api.github.com/users/sonic2kk/repos', 'events_url': 'https://api.github.com/users/sonic2kk/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sonic2kk/subscriptions', 'starred_url': 'https://api.github.com/users/sonic2kk/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sonic2kk/following{/other_user}', 'login': 'sonic2kk', 'received_events_url': 'https://api.github.com/users/sonic2kk/received_events', 'followers_url': 'https://api.github.com/users/sonic2kk/followers', 'organizations_url': 'https://api.github.com/users/sonic2kk/orgs', 'type': 'User'}, 'number': 5281, 'assignee': None, 'comments': 8, 'updated_at': '2017-09-21T13:56:12Z', 'state': 'closed', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/5281.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5281'}, 'author_association': 'NONE', 'labels': [], 'title': 'Android: Changed FAB Placement and Video Settings Icon'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/5281', 'created_at': '2017-09-21T13:56:12Z', 'user': {'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'url': 'https://api.github.com/users/JosJuice', 'gravatar_id': '', 'html_url': 'https://github.com/JosJuice', 'id': 6716818, 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'login': 'JosJuice', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T13:56:12Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331164075', 'body': "Since this PR won't get merged in its current state and the repository that it's based on has been deleted, we can't do much with this PR other than closing it. If you're still interested in getting these changes into Dolphin, feel free to split out the changes to separate PRs. I've created PR #6084 for changing the FAB placement.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5281#issuecomment-331164075', 'id': 331164075, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T13:53:51Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Android: Changed FAB Placement and Video Settings Icon'}
2017-09-21T08:56:59.163604	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#issuecomment-331095602', 'id': 6076, 'source': 'ghhookparser', 'author': 'spycrab', 'body': '@sepalani Actually looked at that table a bunch of times but was too lazy to fill them in thus far. Thanks for reminding me.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6076/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6076', 'milestone': None, 'locked': False, 'id': 258924019, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6076/comments', 'assignees': [], 'created_at': '2017-09-19T18:46:30Z', 'body': 'TODO:\r\n- Windows\r\n  - [x] Registers\r\n  - [ ] Code\r\n  - [ ] Memory\r\n  - [ ] Breakpoints\r\n  - [ ] JIT\r\n  - [ ] Video\r\n  - [ ] Audio\r\n- Interface\r\n  - [ ] Add ability to enable / disable debugging from the interface tab\r\n  - [ ] Add toolbar controls\r\n\r\n*Needs extensive testing*', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6076/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'number': 6076, 'assignee': None, 'comments': 2, 'updated_at': '2017-09-21T08:56:58Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6076.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6076.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': '[WIP] Qt: Implement Debugger'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6076', 'created_at': '2017-09-21T08:56:58Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T08:56:58Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331095602', 'body': '@sepalani Actually looked at that table a bunch of times but was too lazy to fill them in thus far. Thanks for reminding me.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#issuecomment-331095602', 'id': 331095602, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T04:31:19Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': '[WIP] Qt: Implement Debugger'}
2017-09-21T04:31:50.097241	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331048266', 'id': 6083, 'source': 'ghhookparser', 'author': 'Helios747', 'body': 'Done.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': '~~lint punched me in the face twice because it had 3.8 installed and I had 5.0~~\r\n\r\njust kidding. This is a PR to warn Windows users about line endings.', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 6, 'updated_at': '2017-09-21T04:31:49Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Update Contributing.md to warn Windows users about line endings'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T04:31:49Z', 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T04:31:49Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331048266', 'body': 'Done.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331048266', 'id': 331048266, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-21T04:31:19Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Update Contributing.md to warn Windows users about line endings'}
2017-09-21T04:22:32.889204	{'action': 'deleted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331047169', 'id': 6083, 'source': 'ghhookparser', 'author': 'Helios747', 'body': "To get this clear, there's a `clang-format` on the buildbot server, but, what does it do then, I have to fix things manually after a script called `Lint` that appears to be totally separate to `clang-format` raises some alerts.\r\n\r\nSo why can't clang-format run on the server each time a job is run, before the actual compiling begins ?", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'deleted', 'sender': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 7, 'updated_at': '2017-09-21T04:21:52Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T04:21:52Z', 'user': {'gists_url': 'https://api.github.com/users/ZexaronS/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/20824154?v=4', 'url': 'https://api.github.com/users/ZexaronS', 'gravatar_id': '', 'html_url': 'https://github.com/ZexaronS', 'id': 20824154, 'repos_url': 'https://api.github.com/users/ZexaronS/repos', 'events_url': 'https://api.github.com/users/ZexaronS/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ZexaronS/subscriptions', 'starred_url': 'https://api.github.com/users/ZexaronS/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ZexaronS/following{/other_user}', 'login': 'ZexaronS', 'received_events_url': 'https://api.github.com/users/ZexaronS/received_events', 'followers_url': 'https://api.github.com/users/ZexaronS/followers', 'organizations_url': 'https://api.github.com/users/ZexaronS/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T04:21:52Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331047169', 'body': "To get this clear, there's a `clang-format` on the buildbot server, but, what does it do then, I have to fix things manually after a script called `Lint` that appears to be totally separate to `clang-format` raises some alerts.\r\n\r\nSo why can't clang-format run on the server each time a job is run, before the actual compiling begins ?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331047169', 'id': 331047169, 'author_association': 'NONE'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-21T04:21:53.650353	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331047169', 'id': 6083, 'source': 'ghhookparser', 'author': 'ZexaronS', 'body': "To get this clear, there's a `clang-format` on the buildbot server, but, what does it do then, I have to fix things manually after a script called `Lint` that appears to be totally separate to `clang-format` raises some alerts.\r\n\r\nSo why can't clang-format run on the server each time a job is run, before the actual compiling begins ?", 'safe_author': False, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/ZexaronS/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/20824154?v=4', 'url': 'https://api.github.com/users/ZexaronS', 'gravatar_id': '', 'html_url': 'https://github.com/ZexaronS', 'id': 20824154, 'repos_url': 'https://api.github.com/users/ZexaronS/repos', 'events_url': 'https://api.github.com/users/ZexaronS/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ZexaronS/subscriptions', 'starred_url': 'https://api.github.com/users/ZexaronS/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ZexaronS/following{/other_user}', 'login': 'ZexaronS', 'received_events_url': 'https://api.github.com/users/ZexaronS/received_events', 'followers_url': 'https://api.github.com/users/ZexaronS/followers', 'organizations_url': 'https://api.github.com/users/ZexaronS/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 6, 'updated_at': '2017-09-21T04:21:52Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T04:21:52Z', 'user': {'gists_url': 'https://api.github.com/users/ZexaronS/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/20824154?v=4', 'url': 'https://api.github.com/users/ZexaronS', 'gravatar_id': '', 'html_url': 'https://github.com/ZexaronS', 'id': 20824154, 'repos_url': 'https://api.github.com/users/ZexaronS/repos', 'events_url': 'https://api.github.com/users/ZexaronS/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ZexaronS/subscriptions', 'starred_url': 'https://api.github.com/users/ZexaronS/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ZexaronS/following{/other_user}', 'login': 'ZexaronS', 'received_events_url': 'https://api.github.com/users/ZexaronS/received_events', 'followers_url': 'https://api.github.com/users/ZexaronS/followers', 'organizations_url': 'https://api.github.com/users/ZexaronS/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T04:21:52Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331047169', 'body': "To get this clear, there's a `clang-format` on the buildbot server, but, what does it do then, I have to fix things manually after a script called `Lint` that appears to be totally separate to `clang-format` raises some alerts.\r\n\r\nSo why can't clang-format run on the server each time a job is run, before the actual compiling begins ?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331047169', 'id': 331047169, 'author_association': 'NONE'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-21T01:37:50.041883	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331026300', 'id': 6083, 'source': 'ghhookparser', 'author': 'shuffle2', 'body': 'Sounds good to me', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 5, 'updated_at': '2017-09-21T01:37:49Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T01:37:49Z', 'user': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T01:37:49Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331026300', 'body': 'Sounds good to me', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331026300', 'id': 331026300, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-21T01:14:07.448143	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331023066', 'id': 6083, 'source': 'ghhookparser', 'author': 'Helios747', 'body': 'I\'m fine with repurposing this PR to warn windows users about that.\r\n\r\nHow does "Windows users should configure git to checkout UNIX-style line endings" sound? Do we need to provide details?', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 4, 'updated_at': '2017-09-21T01:14:06Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T01:14:06Z', 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T01:14:06Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331023066', 'body': 'I\'m fine with repurposing this PR to warn windows users about that.\r\n\r\nHow does "Windows users should configure git to checkout UNIX-style line endings" sound? Do we need to provide details?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331023066', 'id': 331023066, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-21T01:07:15.790697	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331022155', 'id': 6083, 'source': 'ghhookparser', 'author': 'shuffle2', 'body': 'No, the default is checkout as windows newlines (but commit as unix newlines). So, git handles the conversion, but since the local files are CRLF, clang-format craps itself.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 3, 'updated_at': '2017-09-21T01:07:15Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T01:07:15Z', 'user': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T01:07:15Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331022155', 'body': 'No, the default is checkout as windows newlines (but commit as unix newlines). So, git handles the conversion, but since the local files are CRLF, clang-format craps itself.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331022155', 'id': 331022155, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-21T00:01:38.688178	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331013668', 'id': 6083, 'source': 'ghhookparser', 'author': 'Helios747', 'body': "eh, okay.\r\n\r\nI suppose it would be obnoxious to have to update contributing.md every time we updated lint.\r\n\r\nDoesn't clang-format take care of line endings? In any case, I think a default install of Git for Windows checks out UNIX newlines by default.", 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 2, 'updated_at': '2017-09-21T00:01:37Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-21T00:01:37Z', 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'updated_at': '2017-09-21T00:01:37Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331013668', 'body': "eh, okay.\r\n\r\nI suppose it would be obnoxious to have to update contributing.md every time we updated lint.\r\n\r\nDoesn't clang-format take care of line endings? In any case, I think a default install of Git for Windows checks out UNIX newlines by default.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331013668', 'id': 331013668, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-20T23:58:06.679660	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331013142', 'id': 6083, 'source': 'ghhookparser', 'author': 'shuffle2', 'body': 'then you should run lint.sh instead? :P works here (but someone should add a line to instruction to checkout with linux newlines, for windows users...)', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'milestone': None, 'locked': False, 'id': 259326960, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/comments', 'assignees': [], 'created_at': '2017-09-20T22:58:41Z', 'body': 'lint punched me in the face twice because it had 3.8 installed and I had 5.0', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6083, 'assignee': None, 'comments': 1, 'updated_at': '2017-09-20T23:58:06Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6083.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6083'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'specify clang-format version'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6083', 'created_at': '2017-09-20T23:58:06Z', 'user': {'gists_url': 'https://api.github.com/users/shuffle2/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/113063?v=4', 'url': 'https://api.github.com/users/shuffle2', 'gravatar_id': '', 'html_url': 'https://github.com/shuffle2', 'id': 113063, 'repos_url': 'https://api.github.com/users/shuffle2/repos', 'events_url': 'https://api.github.com/users/shuffle2/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/shuffle2/subscriptions', 'starred_url': 'https://api.github.com/users/shuffle2/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/shuffle2/following{/other_user}', 'login': 'shuffle2', 'received_events_url': 'https://api.github.com/users/shuffle2/received_events', 'followers_url': 'https://api.github.com/users/shuffle2/followers', 'organizations_url': 'https://api.github.com/users/shuffle2/orgs', 'type': 'User'}, 'updated_at': '2017-09-20T23:58:06Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331013142', 'body': 'then you should run lint.sh instead? :P works here (but someone should add a line to instruction to checkout with linux newlines, for windows users...)', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6083#issuecomment-331013142', 'id': 331013142, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'specify clang-format version'}
2017-09-20T23:57:43.785755	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6082#issuecomment-331013085', 'id': 6082, 'source': 'ghhookparser', 'author': 'Helios747', 'body': 'Tricky, because that assumes that all non-conforming vars are named the same way or similar ways.\r\n\r\nFor example, the DCBZOFF and FPRF vars are just acronyms all capped. I imagine there are some typos in var names too.\r\n\r\nI think we could probably hit a lot of them just by somehow detecting CamelCase in class vars though.\r\n\r\nWorth noting that I did re-word one or two vars just because they had dumb names that would have translated to absurdly long var names.', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'issue': {'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6082/labels{/name}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6082', 'milestone': None, 'locked': False, 'id': 259323248, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6082/comments', 'assignees': [], 'created_at': '2017-09-20T22:39:04Z', 'body': "Was poking around in ISOProperties and noticed that a lot of the vars weren't up to date with naming guidelines.", 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6082/events', 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'number': 6082, 'assignee': None, 'comments': 1, 'updated_at': '2017-09-20T23:57:42Z', 'state': 'open', 'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6082.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6082.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082'}, 'author_association': 'CONTRIBUTOR', 'labels': [], 'title': 'Cleanup var naming in ISOProperties'}, 'comment': {'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6082', 'created_at': '2017-09-20T23:57:42Z', 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'updated_at': '2017-09-20T23:57:42Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/331013085', 'body': 'Tricky, because that assumes that all non-conforming vars are named the same way or similar ways.\r\n\r\nFor example, the DCBZOFF and FPRF vars are just acronyms all capped. I imagine there are some typos in var names too.\r\n\r\nI think we could probably hit a lot of them just by somehow detecting CamelCase in class vars though.\r\n\r\nWorth noting that I did re-word one or two vars just because they had dumb names that would have translated to absurdly long var names.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082#issuecomment-331013085', 'id': 331013085, 'author_association': 'CONTRIBUTOR'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3691, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-20T23:46:57Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-20T22:25:19Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 140, 'private': False, 'forks_count': 927, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348872, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 140, 'stargazers_count': 3691, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3691, 'forks': 927, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}}, 'type': 'gh_issue_comment', 'title': 'Cleanup var naming in ISOProperties'}

Recent 'gh_pull_request' events

2017-09-24T22:31:22.217461	{'base_sha': '38a8d04c35b8a042981e003c866da37501475f35', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T22:02:45.347185	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '648477692001fa2809c6509e7e1b5da03e741efe', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-24T20:44:59.905745	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T18:48:59.148127	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '648477692001fa2809c6509e7e1b5da03e741efe', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-24T17:09:22.708427	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'af1a952ebec124395738b4e103bc2907647efb94', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T15:28:53.103510	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'bee862bf59547daaa7aabe41deff2eea231b5ebd', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T15:10:46.830948	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-24T14:56:57.429340	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '07f1285117df528735f4e79f3ac47d4099696bb8', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T14:51:42.803656	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 6075, 'source': 'ghhookparser', 'head_ref_name': 'pcap-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '3fdbfe78189c1c01d013e3fa43ddd5f561ae6e69', 'type': 'gh_pull_request', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}
2017-09-24T11:20:53.968201	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5978', 'id': 5978, 'source': 'ghhookparser', 'head_ref_name': 'net-log', 'author': 'sepalani', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'b4b75f0d82073a4a476da6a51351596d3886b8cb', 'type': 'gh_pull_request', 'title': 'NetworkCaptureLogger: Move SSL logging'}
2017-09-24T09:44:08.606134	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'review_requested', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-24T09:40:29.824253	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'unlabeled', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-24T09:34:48.555976	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-22T20:16:27.654960	{'base_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077', 'id': 6077, 'source': 'ghhookparser', 'head_ref_name': 'dsp-fixes', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '3dc4d1a7d1997fde5b4922949a667017699b6260', 'type': 'gh_pull_request', 'title': 'Small DSP accelerator fixes'}
2017-09-22T06:42:23.922814	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'id': 6084, 'source': 'ghhookparser', 'head_ref_name': 'fab-placement', 'author': 'degasus', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '85ab968136a3e144f51d864345f866806f7f7cae', 'type': 'gh_pull_request', 'title': 'Android: Adjust position of floating action button'}
2017-09-21T16:51:42.171801	{'base_sha': 'e52eae44d4304c4351d9c594d1337037d2f79f85', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5920', 'id': 5920, 'source': 'ghhookparser', 'head_ref_name': 'tmem-cache-optimisation', 'author': 'mimimi085181', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'ff85c7412d46123853dcf788070fcca6351b14e1', 'type': 'gh_pull_request', 'title': 'Optimise tmem cache emulation'}
2017-09-21T16:49:52.394157	{'base_sha': '1705d15d6f3fe1c2f760a4b6bc70542d94b9e9f2', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5971', 'id': 5971, 'source': 'ghhookparser', 'head_ref_name': 'fix-tmem-cache', 'author': 'mimimi085181', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '00651f65e6a123dfdd574236d033d9fd7bfc7967', 'type': 'gh_pull_request', 'title': 'Invalidate the tmem cache on BPMEM_EFB_TL'}
2017-09-21T15:30:47.915763	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'labeled', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076', 'id': 6076, 'source': 'ghhookparser', 'head_ref_name': 'qt_debugger', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request', 'title': '[WIP] Qt: Implement Debugger'}
2017-09-21T15:29:26.419151	{'base_sha': 'd1abd71ccb650e78e27371b19a7e7c861312b787', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6079', 'id': 6079, 'source': 'ghhookparser', 'head_ref_name': 'qt_fix_log', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '0b43e1bcf460c5bfb488acdcc885695152be0a25', 'type': 'gh_pull_request', 'title': 'Qt: Fix log / log config window not being marked as hidden when closing'}
2017-09-21T15:27:43.767858	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'id': 6083, 'source': 'ghhookparser', 'head_ref_name': 'clang', 'author': 'leoetlino', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '22600635546848ade58fc3d95067f1686646ce46', 'type': 'gh_pull_request', 'title': 'Update Contributing.md to warn Windows users about line endings'}
2017-09-21T15:10:44.431646	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6082', 'id': 6082, 'source': 'ghhookparser', 'head_ref_name': 'isoproperties_var_cleanup', 'author': 'Helios747', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '56d0cb8d61b650a784255dc61d29441cc7e98a44', 'type': 'gh_pull_request', 'title': 'Cleanup var naming in ISOProperties'}
2017-09-21T13:56:13.840739	{'base_sha': 'd1dc9d5a0ccbe17f47b74517a0636751de9f888c', 'action': 'closed', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5281', 'id': 5281, 'source': 'ghhookparser', 'head_ref_name': 'master', 'author': 'JosJuice', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': 'dc5d8b32d6a7584d1e447099a44b6d8178d7433d', 'type': 'gh_pull_request', 'title': 'Android: Changed FAB Placement and Video Settings Icon'}
2017-09-21T13:53:51.938477	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'opened', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6084', 'id': 6084, 'source': 'ghhookparser', 'head_ref_name': 'fab-placement', 'author': 'JosJuice', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '85ab968136a3e144f51d864345f866806f7f7cae', 'type': 'gh_pull_request', 'title': 'Android: Adjust position of floating action button'}
2017-09-21T09:09:37.394727	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076', 'id': 6076, 'source': 'ghhookparser', 'head_ref_name': 'qt_debugger', 'author': 'spycrab', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request', 'title': '[WIP] Qt: Implement Debugger'}
2017-09-21T04:31:19.612913	{'base_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'action': 'synchronize', 'base_ref_name': 'master', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083', 'id': 6083, 'source': 'ghhookparser', 'head_ref_name': 'clang', 'author': 'Helios747', 'safe_author': True, 'repo': 'dolphin-emu/dolphin', 'head_sha': '22600635546848ade58fc3d95067f1686646ce46', 'type': 'gh_pull_request', 'title': 'Update Contributing.md to warn Windows users about line endings'}

Recent 'gh_pull_request_comment' events

2017-09-25T00:48:32.492140	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:49.829891	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:49.827292	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:48.023154	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.996412	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.993584	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.990762	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.987797	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.985137	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.982248	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.979371	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672500', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.287288	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673238', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:47.284707	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672514', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-25T00:47:46.601789	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672464', 'id': 6075, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'gh_pull_request_comment'}
2017-09-24T17:46:29.990842	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140662847', 'id': 6077, 'source': 'ghhookparser', 'author': 'delroth', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'type': 'gh_pull_request_comment'}
2017-09-24T15:15:58.973469	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140658976', 'id': 6077, 'source': 'ghhookparser', 'author': 'leoetlino', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'type': 'gh_pull_request_comment'}
2017-09-24T10:50:34.069045	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653125', 'id': 6077, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'gh_pull_request_comment'}
2017-09-24T10:50:34.066346	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653120', 'id': 6077, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': True, 'hash': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'gh_pull_request_comment'}
2017-09-21T19:48:05.784971	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140341734', 'id': 6076, 'source': 'ghhookparser', 'author': 'delroth', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request_comment'}
2017-09-21T18:39:40.491040	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140326606', 'id': 6076, 'source': 'ghhookparser', 'author': 'ligfx', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request_comment'}
2017-09-21T14:42:07.243223	{'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140261757', 'id': 6076, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request_comment'}
2017-09-21T14:41:14.948621	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140261757', 'id': 6076, 'source': 'ghhookparser', 'author': 'lioncash', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request_comment'}
2017-09-21T10:22:51.075667	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140203574', 'id': 6076, 'source': 'ghhookparser', 'author': 'delroth', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'gh_pull_request_comment'}
2017-09-21T08:55:02.927542	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184230', 'id': 6076, 'source': 'ghhookparser', 'author': 'spycrab', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'type': 'gh_pull_request_comment'}
2017-09-21T08:54:23.914590	{'action': 'created', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184083', 'id': 6076, 'source': 'ghhookparser', 'author': 'spycrab', 'repo': 'dolphin-emu/dolphin', 'is_part_of_review': False, 'hash': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'type': 'gh_pull_request_comment'}

Recent 'gh_pull_request_review' events

2017-09-25T00:47:47.971282	{'pr_title': '[WIP] PCAP logging with fake TCP/UDP packet', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#pullrequestreview-64777734', 'comments': [{'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";', 'created_at': '2017-09-25T00:24:56Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672464', 'position': 90, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672464, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 90, 'body': '```cpp\r\nstd::ostringstream ss;\r\nss << std::put_time(std::localtime(&t), " %Y-%m-%d %Hh%Mm%Ss.pcap");\r\n\r\nconst std::string filename =\r\n       File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + ss.str();\r\n...\r\n```', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672464', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672464'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672464'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:26:30Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672500', 'position': 193, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672500, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 193, 'body': '`, 0` can be omitted. By default vectors zero out their contents on construction.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672500', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672500'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672500'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:26:42Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507', 'position': 216, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672507, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 216, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:27:07Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672514', 'position': 277, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672514, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 277, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672514', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672514'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672514'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:27:52Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547', 'position': 341, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672547, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 341, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};', 'created_at': '2017-09-25T00:31:12Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648', 'position': 194, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672648, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 194, 'body': '`std::array`. This also allows replacing the memset below with either a `.fill(0)` or `mac = {};`.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:33:29Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744', 'position': 280, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672744, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 280, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:14Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774', 'position': 324, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672774, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 324, 'body': "This can be moved closer to it's usage point.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&udp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &peer_addr.sin_port, 2);\n+  }\n+  else\n+  {\n+    std::memcpy(&udp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &sock_addr.sin_port, 2);\n+  }\n+  const u16 udp_length = static_cast<u16>(UDP_HEADER_SIZE + length);\n+  udp_header[4] = udp_length >> 8 & 0xFF;\n+  udp_header[5] = udp_length & 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:24Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777', 'position': 365, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672777, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 365, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)', 'created_at': '2017-09-25T00:36:27Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833', 'position': 202, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672833, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 202, 'body': 'Comments should go on top of non-declarative code lines where applicable.\r\n\r\n```cpp\r\nif (is_sender)\r\n{\r\n    // Source MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);\r\n}\r\nelse\r\n{\r\n    // Destination MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());\r\n}', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:37:19Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866', 'position': 344, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672866, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 344, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -22,9 +22,14 @@\n class PCAP final\n {\n public:\n+  static constexpr u32 PCAP_DATA_LINK_TYPE = 147;  // Reserved for internal use.', 'created_at': '2017-09-25T00:43:55Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138', 'position': 4, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140673138, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 4, 'body': 'You may want to place this into an enum class, along with the magic number used [here](#diff-2394256c451ee31017bb735ff6f6f762R94) to represent ethernet.\r\n\r\n', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Common/PcapFile.h'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -316,6 +318,8 @@ struct SConfig\n   bool m_SSLVerifyCert;\n   bool m_SSLDumpRootCA;\n   bool m_SSLDumpPeerCert;\n+  std::unique_ptr<Core::NetworkCaptureLogger> m_network_logger{', 'created_at': '2017-09-25T00:46:33Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673238', 'position': 20, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140673238, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 20, 'body': "Should this not be lazy initialized? It seems kind of wasteful to allocate by default for this when the majority of users likely won't even need to use it.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673238', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673238'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673238'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/ConfigManager.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6075, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-25T00:47:47.276765	{'pr_title': '[WIP] PCAP logging with fake TCP/UDP packet', 'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6075#pullrequestreview-64777734', 'comments': [{'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";', 'created_at': '2017-09-25T00:24:56Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672464', 'position': 90, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672464, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 90, 'body': '```cpp\r\nstd::ostringstream ss;\r\nss << std::put_time(std::localtime(&t), " %Y-%m-%d %Hh%Mm%Ss.pcap");\r\n\r\nconst std::string filename =\r\n       File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + ss.str();\r\n...\r\n```', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672464', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672464'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672464'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:26:30Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672500', 'position': 193, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672500, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 193, 'body': '`, 0` can be omitted. By default vectors zero out their contents on construction.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672500', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672500'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672500'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:26:42Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507', 'position': 216, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672507, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 216, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:27:07Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672514', 'position': 277, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672514, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 277, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672514', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672514'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672514'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:27:52Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547', 'position': 341, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672547, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 341, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};', 'created_at': '2017-09-25T00:31:12Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648', 'position': 194, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672648, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 194, 'body': '`std::array`. This also allows replacing the memset below with either a `.fill(0)` or `mac = {};`.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:33:29Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744', 'position': 280, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672744, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 280, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:14Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774', 'position': 324, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672774, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 324, 'body': "This can be moved closer to it's usage point.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&udp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &peer_addr.sin_port, 2);\n+  }\n+  else\n+  {\n+    std::memcpy(&udp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &sock_addr.sin_port, 2);\n+  }\n+  const u16 udp_length = static_cast<u16>(UDP_HEADER_SIZE + length);\n+  udp_header[4] = udp_length >> 8 & 0xFF;\n+  udp_header[5] = udp_length & 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:24Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777', 'position': 365, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672777, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 365, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)', 'created_at': '2017-09-25T00:36:27Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833', 'position': 202, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672833, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 202, 'body': 'Comments should go on top of non-declarative code lines where applicable.\r\n\r\n```cpp\r\nif (is_sender)\r\n{\r\n    // Source MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);\r\n}\r\nelse\r\n{\r\n    // Destination MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());\r\n}', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:37:19Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866', 'position': 344, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672866, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 344, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -22,9 +22,14 @@\n class PCAP final\n {\n public:\n+  static constexpr u32 PCAP_DATA_LINK_TYPE = 147;  // Reserved for internal use.', 'created_at': '2017-09-25T00:43:55Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138', 'position': 4, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140673138, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 4, 'body': 'You may want to place this into an enum class, along with the magic number used [here](#diff-2394256c451ee31017bb735ff6f6f762R94) to represent ethernet.\r\n\r\n', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Common/PcapFile.h'}, {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -316,6 +318,8 @@ struct SConfig\n   bool m_SSLVerifyCert;\n   bool m_SSLDumpRootCA;\n   bool m_SSLDumpPeerCert;\n+  std::unique_ptr<Core::NetworkCaptureLogger> m_network_logger{', 'created_at': '2017-09-25T00:46:33Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673238', 'position': 20, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140673238, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 20, 'body': "Should this not be lazy initialized? It seems kind of wasteful to allocate by default for this when the majority of users likely won't even need to use it.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673238', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673238'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673238'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/ConfigManager.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6075, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-24T20:35:38.397708	{'pr_title': 'Small DSP accelerator fixes', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#pullrequestreview-64772256', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'delroth', 'pr_id': 6077, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-24T17:46:30.747099	{'pr_title': 'Small DSP accelerator fixes', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#pullrequestreview-64768432', 'comments': [{'commit_id': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'diff_hunk': '@@ -98,7 +98,7 @@ u16 gdsp_mbox_read_l(Mailbox mbx)\n   return (u16)value;\n }\n \n-void gdsp_ifx_write(u32 addr, u32 val)\n+void gdsp_ifx_write(u32 addr, u16 val)', 'created_at': '2017-09-24T17:46:28Z', 'user': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140662847', 'position': 5, 'pull_request_review_id': 64768432, 'updated_at': '2017-09-24T17:46:29Z', 'id': 140662847, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'OWNER', 'original_position': 5, 'body': 'Since some compilers are broken (*cough* clang *cough*) this needs an appropriate change in our JIT to clear the upper 16 bits of the value when the function is called.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140662847', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140662847'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140662847'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'path': 'Source/Core/Core/DSP/DSPHWInterface.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'delroth', 'pr_id': 6077, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-24T15:15:59.590859	{'pr_title': 'Small DSP accelerator fixes', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#pullrequestreview-64764965', 'comments': [{'commit_id': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'diff_hunk': '@@ -4,18 +4,54 @@\n \n #pragma once\n \n-#include <functional>\n-\n #include "Common/CommonTypes.h"\n \n+class PointerWrap;\n+\n namespace DSP\n {\n-u16 ReadAccelerator(u32 start_address, u32 end_address, u32* current_address, u16 sample_format,\n-                    s16* yn1, s16* yn2, u16* pred_scale, s16* coefs,\n-                    std::function<void()> end_exception);\n+class Accelerator', 'created_at': '2017-09-24T15:15:57Z', 'user': {'gists_url': 'https://api.github.com/users/leoetlino/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/4209061?v=4', 'url': 'https://api.github.com/users/leoetlino', 'gravatar_id': '', 'html_url': 'https://github.com/leoetlino', 'id': 4209061, 'repos_url': 'https://api.github.com/users/leoetlino/repos', 'events_url': 'https://api.github.com/users/leoetlino/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/leoetlino/subscriptions', 'starred_url': 'https://api.github.com/users/leoetlino/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/leoetlino/following{/other_user}', 'login': 'leoetlino', 'received_events_url': 'https://api.github.com/users/leoetlino/received_events', 'followers_url': 'https://api.github.com/users/leoetlino/followers', 'organizations_url': 'https://api.github.com/users/leoetlino/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140658976', 'position': 15, 'pull_request_review_id': 64764965, 'updated_at': '2017-09-24T15:15:57Z', 'id': 140658976, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'MEMBER', 'original_position': 15, 'in_reply_to_id': 140653125, 'body': 'Thanks, fixed both issues.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140658976', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140658976'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140658976'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'path': 'Source/Core/Core/DSP/DSPAccelerator.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'leoetlino', 'pr_id': 6077, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-24T10:50:34.058547	{'pr_title': 'Small DSP accelerator fixes', 'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#pullrequestreview-64759096', 'comments': [{'commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'diff_hunk': '@@ -111,11 +113,21 @@ static void DSPCore_FreeMemoryPages()\n   g_dsp.irom = g_dsp.iram = g_dsp.dram = g_dsp.coef = nullptr;\n }\n \n+class LLEAccelerator : public Accelerator', 'created_at': '2017-09-24T10:49:39Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653120', 'position': 19, 'pull_request_review_id': 64759096, 'updated_at': '2017-09-24T10:50:31Z', 'id': 140653120, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'OWNER', 'original_position': 19, 'body': 'This and the HLE accelerator can likely be made final', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653120', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653120'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653120'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'path': 'Source/Core/Core/DSP/DSPCore.cpp'}, {'commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'diff_hunk': '@@ -4,18 +4,54 @@\n \n #pragma once\n \n-#include <functional>\n-\n #include "Common/CommonTypes.h"\n \n+class PointerWrap;\n+\n namespace DSP\n {\n-u16 ReadAccelerator(u32 start_address, u32 end_address, u32* current_address, u16 sample_format,\n-                    s16* yn1, s16* yn2, u16* pred_scale, s16* coefs,\n-                    std::function<void()> end_exception);\n+class Accelerator', 'created_at': '2017-09-24T10:50:02Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653125', 'position': 15, 'pull_request_review_id': 64759096, 'updated_at': '2017-09-24T10:50:32Z', 'id': 140653125, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'OWNER', 'original_position': 15, 'body': 'This should probably have a virtual destructor', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653125', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653125'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653125'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'path': 'Source/Core/Core/DSP/DSPAccelerator.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6077, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-24T10:50:33.458441	{'pr_title': 'Small DSP accelerator fixes', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6077#pullrequestreview-64759096', 'comments': [{'commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'diff_hunk': '@@ -111,11 +113,21 @@ static void DSPCore_FreeMemoryPages()\n   g_dsp.irom = g_dsp.iram = g_dsp.dram = g_dsp.coef = nullptr;\n }\n \n+class LLEAccelerator : public Accelerator', 'created_at': '2017-09-24T10:49:39Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653120', 'position': 19, 'pull_request_review_id': 64759096, 'updated_at': '2017-09-24T10:50:31Z', 'id': 140653120, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'OWNER', 'original_position': 19, 'body': 'This and the HLE accelerator can likely be made final', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653120', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653120'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653120'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'path': 'Source/Core/Core/DSP/DSPCore.cpp'}, {'commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'diff_hunk': '@@ -4,18 +4,54 @@\n \n #pragma once\n \n-#include <functional>\n-\n #include "Common/CommonTypes.h"\n \n+class PointerWrap;\n+\n namespace DSP\n {\n-u16 ReadAccelerator(u32 start_address, u32 end_address, u32* current_address, u16 sample_format,\n-                    s16* yn1, s16* yn2, u16* pred_scale, s16* coefs,\n-                    std::function<void()> end_exception);\n+class Accelerator', 'created_at': '2017-09-24T10:50:02Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653125', 'position': 15, 'pull_request_review_id': 64759096, 'updated_at': '2017-09-24T10:50:32Z', 'id': 140653125, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077', 'author_association': 'OWNER', 'original_position': 15, 'body': 'This should probably have a virtual destructor', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653125', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6077#discussion_r140653125'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140653125'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6077'}}, 'original_commit_id': '029cdeec61598579a521e56c6206e15469e1eebd', 'path': 'Source/Core/Core/DSP/DSPAccelerator.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6077, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T19:48:05.780475	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64401773', 'comments': [{'commit_id': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-21T19:48:04Z', 'user': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140341734', 'position': 9, 'pull_request_review_id': 64401773, 'updated_at': '2017-09-21T19:48:04Z', 'id': 140341734, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'OWNER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "Can you claim that of all the settings that you will store in QSettings, none of them will ever have any use case for human editing?\r\n\r\nIf not, then it should be human editable.\r\n\r\nFYI with DolphinWX I have a set of configs for the debugger windows which I toggle through a script depending on what I'm doing :)", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140341734', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140341734'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140341734'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'delroth', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T18:39:40.489766	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64383543', 'comments': [{'commit_id': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-21T18:39:38Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140326606', 'position': 9, 'pull_request_review_id': 64383543, 'updated_at': '2017-09-21T18:39:38Z', 'id': 140326606, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "I'm for (2), since it's just so darn convenient.\r\n\r\nI'd also claim that it's **not** a requirement for these to be stored in a human-editable format. They are much closer to stored UI state rather than actual configuration: what's the use-case for going in and manually editing the log window geometry, for instance?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140326606', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140326606'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140326606'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'ligfx', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T14:41:15.634062	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64308193', 'comments': [{'commit_id': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-21T14:41:13Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140261757', 'position': 9, 'pull_request_review_id': 64308193, 'updated_at': '2017-09-21T14:41:13Z', 'id': 140261757, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'OWNER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': 'FWIW, I\'m leaning on (2), since QSettings likely integrates with the rest of Qt and its event system in a more convenient way.\r\n\r\n> stored in a mostly human editable format in Dolphin\'s User/Config directory.\r\n\r\nThis should be relatively easy to do for the most part. It can be kicked to disk in ini format by doing.\r\n\r\n```cpp\r\n// Opening directly\r\nQSettings settings{"/path/to/ini.ini", QSettings::IniFormat};\r\n\r\n// ... or if the path needs to be determined later or set before creating instances.\r\n// All inis created through QSettings will be placed in the specified directory.\r\nQSettings::setPath(QSettings::IniFormat, QSettings::UserScope, "/directory/to/put/inis/in");\r\n```', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140261757', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140261757'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140261757'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T10:22:51.071259	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64239931', 'comments': [{'commit_id': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-21T10:22:49Z', 'user': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140203574', 'position': 9, 'pull_request_review_id': 64239931, 'updated_at': '2017-09-21T10:22:49Z', 'id': 140203574, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'OWNER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "My preference is to (1) but (2) is fine as long as it behaves like normal Dolphin settings: stored in a mostly human editable format in Dolphin's User/Config directory.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140203574', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140203574'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140203574'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'delroth', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T08:55:02.925378	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64217861', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -6,10 +6,13 @@\n #include <QSettings>\n #include <QSize>\n \n+#include <iostream>', 'created_at': '2017-09-21T08:55:01Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140184230', 'position': 4, 'pull_request_review_id': 64217861, 'updated_at': '2017-09-21T08:55:01Z', 'id': 140184230, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 4, 'in_reply_to_id': 140059639, 'body': 'Would have removed it anyway as it is a leftover but thanks for the extra information!', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184230', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184230'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140184230'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/DolphinQt2/Settings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'spycrab', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T08:54:23.909822	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64217680', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-21T08:54:22Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140184083', 'position': 9, 'pull_request_review_id': 64217680, 'updated_at': '2017-09-21T08:54:22Z', 'id': 140184083, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "@delroth Sorry I misunderstood that then I guess. That was my attempt at integrating it into the config system.\r\n\r\nAnyway I guess there are the following other ways of implementing it:\r\n1. Moving the InterfaceSettings class to UICommon / DolphinQt2 (probably the latter)\r\n2. Using QSettings\r\n3. Parsing and Writing to the INI manually\r\n\r\nI'd be fine with either 1 or 2 (or another option that I didn't list here).\r\n\r\n3 seems pretty cumbersome and regarding some aspects even worse than the current solution.\r\n\r\nSo what should I do?", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184083', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140184083'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140184083'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'spycrab', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-21T01:40:56.098438	{'pr_title': 'GameINI: Add INIs for Brawl VC games', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/5866#pullrequestreview-64160963', 'comments': [{'commit_id': '7ecd22200f04ff69e240cc8becb45b1057b01f15', 'diff_hunk': '@@ -0,0 +1,14 @@\n+# HA8xxx - Super Mario Bros. (Brawl VC)', 'created_at': '2017-09-21T01:40:54Z', 'user': {'gists_url': 'https://api.github.com/users/xerxespersrex/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/10529746?v=4', 'url': 'https://api.github.com/users/xerxespersrex', 'gravatar_id': '', 'html_url': 'https://github.com/xerxespersrex', 'id': 10529746, 'repos_url': 'https://api.github.com/users/xerxespersrex/repos', 'events_url': 'https://api.github.com/users/xerxespersrex/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/xerxespersrex/subscriptions', 'starred_url': 'https://api.github.com/users/xerxespersrex/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/xerxespersrex/following{/other_user}', 'login': 'xerxespersrex', 'received_events_url': 'https://api.github.com/users/xerxespersrex/received_events', 'followers_url': 'https://api.github.com/users/xerxespersrex/followers', 'organizations_url': 'https://api.github.com/users/xerxespersrex/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140132611', 'position': 1, 'pull_request_review_id': 64160963, 'updated_at': '2017-09-21T01:40:54Z', 'id': 140132611, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5866', 'author_association': 'NONE', 'original_position': 1, 'body': 'Supposed to be HA9xxx to match the file name?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/5866#discussion_r140132611', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/5866#discussion_r140132611'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140132611'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/5866'}}, 'original_commit_id': '7ecd22200f04ff69e240cc8becb45b1057b01f15', 'path': 'Data/Sys/GameSettings/HA9.ini'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'xerxespersrex', 'pr_id': 5866, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:47:05.135393	{'pr_title': 'Cleanup var naming in ISOProperties', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6082#pullrequestreview-64147533', 'comments': [{'commit_id': '56d0cb8d61b650a784255dc61d29441cc7e98a44', 'diff_hunk': '@@ -67,26 +67,26 @@ class CISOProperties : public wxDialog\n   PHackData m_PHack_Data;', 'created_at': '2017-09-20T23:47:03Z', 'user': {'gists_url': 'https://api.github.com/users/Helios747/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/6785841?v=4', 'url': 'https://api.github.com/users/Helios747', 'gravatar_id': '', 'html_url': 'https://github.com/Helios747', 'id': 6785841, 'repos_url': 'https://api.github.com/users/Helios747/repos', 'events_url': 'https://api.github.com/users/Helios747/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/Helios747/subscriptions', 'starred_url': 'https://api.github.com/users/Helios747/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/Helios747/following{/other_user}', 'login': 'Helios747', 'received_events_url': 'https://api.github.com/users/Helios747/received_events', 'followers_url': 'https://api.github.com/users/Helios747/followers', 'organizations_url': 'https://api.github.com/users/Helios747/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140120252', 'position': None, 'pull_request_review_id': 64147533, 'updated_at': '2017-09-20T23:47:03Z', 'id': 140120252, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082', 'author_association': 'MEMBER', 'original_position': 1, 'in_reply_to_id': 140117342, 'body': 'oops. gottem', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140120252', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140120252'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140120252'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082'}}, 'original_commit_id': '5b2d80726ceb18f6254a35eea33b9021c46cd331', 'path': 'Source/Core/DolphinWX/ISOProperties/ISOProperties.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'Helios747', 'pr_id': 6082, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:27:11.967243	{'pr_title': 'Cleanup var naming in ISOProperties', 'action': 'edited', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6082#pullrequestreview-64144402', 'comments': [{'commit_id': '5b2d80726ceb18f6254a35eea33b9021c46cd331', 'diff_hunk': '@@ -67,26 +67,26 @@ class CISOProperties : public wxDialog\n   PHackData m_PHack_Data;', 'created_at': '2017-09-20T23:25:34Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140117342', 'position': 1, 'pull_request_review_id': 64144402, 'updated_at': '2017-09-20T23:27:09Z', 'id': 140117342, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082', 'author_association': 'OWNER', 'original_position': 1, 'body': 'were these two variables missed?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140117342', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140117342'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140117342'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082'}}, 'original_commit_id': '5b2d80726ceb18f6254a35eea33b9021c46cd331', 'path': 'Source/Core/DolphinWX/ISOProperties/ISOProperties.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6082, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:27:11.361732	{'pr_title': 'Cleanup var naming in ISOProperties', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6082#pullrequestreview-64144402', 'comments': [{'commit_id': '5b2d80726ceb18f6254a35eea33b9021c46cd331', 'diff_hunk': '@@ -67,26 +67,26 @@ class CISOProperties : public wxDialog\n   PHackData m_PHack_Data;', 'created_at': '2017-09-20T23:25:34Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140117342', 'position': 1, 'pull_request_review_id': 64144402, 'updated_at': '2017-09-20T23:27:09Z', 'id': 140117342, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082', 'author_association': 'OWNER', 'original_position': 1, 'body': 'were these two variables missed?', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140117342', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6082#discussion_r140117342'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140117342'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6082'}}, 'original_commit_id': '5b2d80726ceb18f6254a35eea33b9021c46cd331', 'path': 'Source/Core/DolphinWX/ISOProperties/ISOProperties.h'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6082, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:07:38.489551	{'pr_title': 'specify clang-format version', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#pullrequestreview-64141690', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'JonnyH', 'pr_id': 6083, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:00:49.640392	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64140610', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-20T23:00:48Z', 'user': {'gists_url': 'https://api.github.com/users/delroth/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/202798?v=4', 'url': 'https://api.github.com/users/delroth', 'gravatar_id': '', 'html_url': 'https://github.com/delroth', 'id': 202798, 'repos_url': 'https://api.github.com/users/delroth/repos', 'events_url': 'https://api.github.com/users/delroth/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/delroth/subscriptions', 'starred_url': 'https://api.github.com/users/delroth/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/delroth/following{/other_user}', 'login': 'delroth', 'received_events_url': 'https://api.github.com/users/delroth/received_events', 'followers_url': 'https://api.github.com/users/delroth/followers', 'organizations_url': 'https://api.github.com/users/delroth/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140113943', 'position': 9, 'pull_request_review_id': 64140610, 'updated_at': '2017-09-20T23:00:48Z', 'id': 140113943, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'OWNER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "> I was told that - when possible - I should always make UI Settings part of Core.\r\n\r\nI didn't say that, I said that we should aim to have only one config system because otherwise it will just have inconsistencies all over. The portable directory behavior was just one example.\r\n\r\nFWIW, I think defining UI settings in Core is as much of a terrible idea.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140113943', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140113943'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140113943'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'delroth', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T23:00:40.626863	{'pr_title': 'specify clang-format version', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6083#pullrequestreview-64140587', 'comments': [], 'state': 'changes_requested', 'source': 'ghhookparser', 'author': 'JonnyH', 'pr_id': 6083, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T18:52:25.013495	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64079538', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-20T18:52:23Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140060320', 'position': 9, 'pull_request_review_id': 64079538, 'updated_at': '2017-09-20T18:52:23Z', 'id': 140060320, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "I don't really care, using QSettings is simpler anyway.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140060320', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140060320'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140060320'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'spycrab', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T18:50:05.421337	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64078823', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -6,10 +6,13 @@\n #include <QSettings>\n #include <QSize>\n \n+#include <iostream>', 'created_at': '2017-09-20T18:50:02Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140059639', 'position': 4, 'pull_request_review_id': 64078823, 'updated_at': '2017-09-20T18:50:02Z', 'id': 140059639, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'OWNER', 'original_position': 4, 'body': "This can be removed. Note that this causes [code](https://godbolt.org/g/q48TYs) to be executed even when it isn't used, because most iostream implementations inject a static constructor into the translation unit its included into.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140059639', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140059639'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140059639'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/DolphinQt2/Settings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'lioncash', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T18:49:12.796321	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64078560', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-20T18:49:10Z', 'user': {'gists_url': 'https://api.github.com/users/ligfx/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/594093?v=4', 'url': 'https://api.github.com/users/ligfx', 'gravatar_id': '', 'html_url': 'https://github.com/ligfx', 'id': 594093, 'repos_url': 'https://api.github.com/users/ligfx/repos', 'events_url': 'https://api.github.com/users/ligfx/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/ligfx/subscriptions', 'starred_url': 'https://api.github.com/users/ligfx/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/ligfx/following{/other_user}', 'login': 'ligfx', 'received_events_url': 'https://api.github.com/users/ligfx/received_events', 'followers_url': 'https://api.github.com/users/ligfx/followers', 'organizations_url': 'https://api.github.com/users/ligfx/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140059393', 'position': 9, 'pull_request_review_id': 64078560, 'updated_at': '2017-09-20T18:49:11Z', 'id': 140059393, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': "I'm with @lioncash on this. It doesn't make a lot of sense to me to put UI state / ephemeral settings in core. Especially with the new config layer stuff: what would it mean for a gameini or for netplay to set DEBUGGER_SHOW_REGISTERS? What's the use case?\r\n\r\n@delroth made a good point in that other PR about having these settings respect portable.txt. In that case, we could tell QSettings to keep the settings local to the binary directory, and still have the logical separation of the setting types.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140059393', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140059393'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140059393'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'ligfx', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T18:41:04.098608	{'pr_title': 'Qt: Fix log / log config window not being marked as hidden when closing', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6079#pullrequestreview-64076174', 'comments': [], 'state': 'approved', 'source': 'ghhookparser', 'author': 'ligfx', 'pr_id': 6079, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}
2017-09-20T18:40:20.882336	{'pr_title': '[WIP] Qt: Implement Debugger', 'action': 'submitted', 'url': 'https://github.com/dolphin-emu/dolphin/pull/6076#pullrequestreview-64075990', 'comments': [{'commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'diff_hunk': '@@ -0,0 +1,18 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/Config/InterfaceSettings.h"\n+\n+namespace Config\n+{\n+const ConfigInfo<bool> DEBUGGER_SHOW_REGISTERS({System::Main, "Interface",', 'created_at': '2017-09-20T18:40:19Z', 'user': {'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'url': 'https://api.github.com/users/spycrab', 'gravatar_id': '', 'html_url': 'https://github.com/spycrab', 'id': 1440715, 'repos_url': 'https://api.github.com/users/spycrab/repos', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'login': 'spycrab', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'followers_url': 'https://api.github.com/users/spycrab/followers', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140057087', 'position': 9, 'pull_request_review_id': 64075990, 'updated_at': '2017-09-20T18:40:19Z', 'id': 140057087, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076', 'author_association': 'MEMBER', 'original_position': 9, 'in_reply_to_id': 139997104, 'body': 'See the discussion in the PR #6005.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140057087', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6076#discussion_r140057087'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140057087'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6076'}}, 'original_commit_id': '67e089cf9fbddaf92a59cb6ab8c7cb19f542be06', 'path': 'Source/Core/Core/Config/InterfaceSettings.cpp'}], 'state': 'commented', 'source': 'ghhookparser', 'author': 'spycrab', 'pr_id': 6076, 'repo': 'dolphin-emu/dolphin', 'type': 'gh_pull_request_review'}

Recent 'gh_push' events

2017-09-24T22:02:47.181534	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '05cdbccc3882ecd5778371a95801951519eed5d7', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSPSpy/Base: Clean up trailing whitespace', 'modified': ['Source/DSPSpy/tests/dsp_base.inc'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/05cdbccc3882ecd5778371a95801951519eed5d7', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'e569d3bc4a8d011eb7d93034fc386f9174b397b0', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSPSpy/Base: Handle ACCOV exceptions\n\nThis allows dspspy to show that an ACCOV happened, and to resume\naccelerator reads after an ACCOV (by refreshing the YN2 register).', 'modified': ['Source/DSPSpy/tests/dsp_base.inc'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e569d3bc4a8d011eb7d93034fc386f9174b397b0', 'added': [], 'removed': [], 'distinct': True}, {'hash': '99e36cd9d98802ce0eba5d28dbfb99a71fd05dcf', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSPSpy: Print ACCOV mails', 'modified': ['Source/DSPSpy/main_spy.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/99e36cd9d98802ce0eba5d28dbfb99a71fd05dcf', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7c01127ac6b37728be435a82ae6d7a2939cf81c7', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "DSPSpy: Add a test for accelerator loop\n\nThis adds a test ucode that can be used to check the accelerator loop\nbehaviour with various start/end addresses.\n\nIt's actually more of a test template than a ready to use test.", 'modified': [], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7c01127ac6b37728be435a82ae6d7a2939cf81c7', 'added': ['Source/DSPSpy/tests/accelerator_loop_test.ds'], 'removed': [], 'distinct': True}, {'hash': '017bfcda2be6683af57bedc972e6da2d37534784', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSP: Fix gdsp_ifx_write to take a u16 value\n\nAnd change the JIT to clear the upper 16 bits when calling the write\nfunction to work around bugs in some compilers like clang.', 'modified': ['Source/Core/Core/DSP/DSPHWInterface.cpp', 'Source/Core/Core/DSP/DSPHWInterface.h', 'Source/Core/Core/DSP/Jit/DSPJitUtil.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/017bfcda2be6683af57bedc972e6da2d37534784', 'added': [], 'removed': [], 'distinct': True}, {'hash': '003dba5275c12a883104be2e670aeedfeb92f526', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "DSP: Convert accelerator to a C++ class\n\nSlightly cleaner, allows DSP accelerator behaviour to be\nadded to both HLE and LLE pretty easily, and makes the accelerator\neasier to unit test.\n\nI chose to include all accelerator state as private members, and\nto expose state that is accessible via registers with getters/setters.\nIt's more verbose, yes, but it makes it very clear what is part of\nthe accelerator state and what isn't (e.g. coefs).\n\nThis works quite well for registers, since the accelerator can do\nwhatever it wants internally. For example, the start/end/current\naddresses are masked -- having a getter/setter makes it easier to\nenforce the mask.", 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp', 'Source/Core/Core/DSP/DSPAccelerator.h', 'Source/Core/Core/DSP/DSPCore.cpp', 'Source/Core/Core/DSP/DSPCore.h', 'Source/Core/Core/DSP/DSPHWInterface.cpp', 'Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h', 'Source/Core/Core/HW/DSPLLE/DSPLLE.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/003dba5275c12a883104be2e670aeedfeb92f526', 'added': [], 'removed': [], 'distinct': True}, {'hash': '8310a672b01763c5c783f6afb638bcd23b07005d', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSP: Fix the predscale update logic\n\nWhen the current address is xxxxxxxf, after doing the standard ADPCM\ndecoding and incrementing the current address as usual to get the\nnext address, the DSP will update the predscale register by reading\n2 bytes from memory, and add two to get the next address.\n\nThis means xxxxxx10 cannot be a current address, as the DSP goes\nfrom 0f to 12 directly.\n\nA more serious issue with the old code is that if the start address\nis 16-byte aligned, some samples will always be skipped, even when\nthat should not be the case.\n\nAn easy way to test whether this behaviour is correct is to check\nthe current address register and the predscale after each read.\n\nOld code:\n...\nACCA=00000002, predscale=<value>\nACCA=00000003, predscale=<value>\n...\nACCA=0000000f, predscale=<value>\nACCA=00000010, predscale=<another value>\nACCA=00000013, predscale=<another value>\nACCA=00000014, predscale=<another value>\n...\n\nNew code (and console):\n...\nACCA=00000002, predscale=<value>\nACCA=00000003, predscale=<value>\n...\nACCA=0000000f, predscale=<value>\nACCA=00000012, predscale=<another value>\nACCA=00000013, predscale=<another value>\n...', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8310a672b01763c5c783f6afb638bcd23b07005d', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'bd03f2e46e17df701ed136f700e6508a03ea6a9f', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSP: Fix ACCOV not suspending accelerator reads\n\nWhen an ACCOV is triggered, the accelerator stops reading back anything\nand updating the current address until the YN2 register is set.\n\nThis is kept track of internally by the DSP; this state is not exposed\nvia any register.\n\nHowever, we need to emulate this behaviour correctly because some\nucodes rely on it (notably AX GC); failure to emulate it will result\nin reading past the end and start address for non-looped voices.', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp', 'Source/Core/Core/DSP/DSPAccelerator.h', 'Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h', 'Source/Core/Core/State.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/bd03f2e46e17df701ed136f700e6508a03ea6a9f', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'de6e80736445110aa3f1e896fbfd75ac1cadc090', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': "DSP: Handle two accelerator loop edge cases properly\n\nThere are two special cases that the DSP accelerator handles in a\nspecial way: when the end address is of the form xxxxxxx0 or\nxxxxxxx1.\n\nFor these two cases, the normal overflow handling doesn't apply.\nInstead, the overflow check is different, the ACCOV exception never\nfires at all, the predscale register is not updated, reads are not\nsuspended, and if the end address is 16-byte aligned, the DSP loops\nback to start_address + 1 instead of the regular start_address.", 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/de6e80736445110aa3f1e896fbfd75ac1cadc090', 'added': [], 'removed': [], 'distinct': True}, {'hash': '5dae20ea9d2dfefcc507b3c6da41a31371803340', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'UnitTests: Add DSP accelerator tests\n\nIncludes DSP accelerator tests for basic behaviour, and everything\nthat was fixed by the PR.', 'modified': ['Source/UnitTests/Core/CMakeLists.txt'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5dae20ea9d2dfefcc507b3c6da41a31371803340', 'added': ['Source/UnitTests/Core/DSP/DSPAcceleratorTest.cpp'], 'removed': [], 'distinct': True}, {'hash': '648477692001fa2809c6509e7e1b5da03e741efe', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSP: Fix a missing mask for the predscale register', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/648477692001fa2809c6509e7e1b5da03e741efe', 'added': [], 'removed': [], 'distinct': True}, {'hash': '38a8d04c35b8a042981e003c866da37501475f35', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6077 from leoetlino/dsp-fixes\n\nSmall DSP accelerator fixes', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp', 'Source/Core/Core/DSP/DSPAccelerator.h', 'Source/Core/Core/DSP/DSPCore.cpp', 'Source/Core/Core/DSP/DSPCore.h', 'Source/Core/Core/DSP/DSPHWInterface.cpp', 'Source/Core/Core/DSP/DSPHWInterface.h', 'Source/Core/Core/DSP/Jit/DSPJitUtil.cpp', 'Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h', 'Source/Core/Core/HW/DSPLLE/DSPLLE.cpp', 'Source/Core/Core/State.cpp', 'Source/DSPSpy/main_spy.cpp', 'Source/DSPSpy/tests/dsp_base.inc', 'Source/UnitTests/Core/CMakeLists.txt'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/38a8d04c35b8a042981e003c866da37501475f35', 'added': ['Source/DSPSpy/tests/accelerator_loop_test.ds', 'Source/UnitTests/Core/DSP/DSPAcceleratorTest.cpp'], 'removed': [], 'distinct': True}], 'after_sha': '38a8d04c35b8a042981e003c866da37501475f35', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-22T06:42:25.351566	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '85ab968136a3e144f51d864345f866806f7f7cae', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Android: Adjust position of floating action button', 'modified': ['Source/Android/app/src/main/res/layout/activity_main.xml'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/85ab968136a3e144f51d864345f866806f7f7cae', 'added': [], 'removed': [], 'distinct': True}, {'hash': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'author': {'name': 'Markus Wick', 'username': 'degasus', 'email': 'degasus@users.noreply.github.com'}, 'message': 'Merge pull request #6084 from JosJuice/fab-placement\n\nAndroid: Adjust position of floating action button', 'modified': ['Source/Android/app/src/main/res/layout/activity_main.xml'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '8ebdd62f45f6b23e410e5de39e48a4ff87a7f06b', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '969a72faed2844bebdf38caa3293e05604db6e10', 'repo': 'dolphin-emu/dolphin', 'pusher': 'degasus'}
2017-09-21T15:29:26.522975	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '0b43e1bcf460c5bfb488acdcc885695152be0a25', 'author': {'name': 'spycrab', 'username': 'spycrab', 'email': 'spycrab@users.noreply.github.com'}, 'message': 'Qt: Fix log / log config window not being marked as hidden when closing', 'modified': ['Source/Core/DolphinQt2/Config/LogConfigWidget.cpp', 'Source/Core/DolphinQt2/Config/LogConfigWidget.h', 'Source/Core/DolphinQt2/Config/LogWidget.cpp', 'Source/Core/DolphinQt2/Config/LogWidget.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/0b43e1bcf460c5bfb488acdcc885695152be0a25', 'added': [], 'removed': [], 'distinct': True}, {'hash': '969a72faed2844bebdf38caa3293e05604db6e10', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6079 from spycrab/qt_fix_log\n\nQt: Fix log / log config window not being marked as hidden when closing', 'modified': ['Source/Core/DolphinQt2/Config/LogConfigWidget.cpp', 'Source/Core/DolphinQt2/Config/LogConfigWidget.h', 'Source/Core/DolphinQt2/Config/LogWidget.cpp', 'Source/Core/DolphinQt2/Config/LogWidget.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/969a72faed2844bebdf38caa3293e05604db6e10', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '969a72faed2844bebdf38caa3293e05604db6e10', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '106539f346e94981febc45953b0a52cb47a1512e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-21T15:27:43.975774	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '22600635546848ade58fc3d95067f1686646ce46', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'aserna3@gmail.com'}, 'message': 'specify clang-format version', 'modified': ['Contributing.md'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/22600635546848ade58fc3d95067f1686646ce46', 'added': [], 'removed': [], 'distinct': True}, {'hash': '106539f346e94981febc45953b0a52cb47a1512e', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6083 from Helios747/clang\n\nUpdate Contributing.md to warn Windows users about line endings', 'modified': ['Contributing.md'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/106539f346e94981febc45953b0a52cb47a1512e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '106539f346e94981febc45953b0a52cb47a1512e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '96adbb23398d6447d7a02394b542e1bbfcc6e631', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-21T15:10:45.300209	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '56d0cb8d61b650a784255dc61d29441cc7e98a44', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'aserna3@gmail.com'}, 'message': 'Cleanup var naming in ISOProperties', 'modified': ['Source/Core/DolphinWX/ISOProperties/ISOProperties.cpp', 'Source/Core/DolphinWX/ISOProperties/ISOProperties.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/56d0cb8d61b650a784255dc61d29441cc7e98a44', 'added': [], 'removed': [], 'distinct': True}, {'hash': '96adbb23398d6447d7a02394b542e1bbfcc6e631', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #6082 from Helios747/isoproperties_var_cleanup\n\nCleanup var naming in ISOProperties', 'modified': ['Source/Core/DolphinWX/ISOProperties/ISOProperties.cpp', 'Source/Core/DolphinWX/ISOProperties/ISOProperties.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/96adbb23398d6447d7a02394b542e1bbfcc6e631', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '96adbb23398d6447d7a02394b542e1bbfcc6e631', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-09-20T17:06:34.556073	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '47a2a16b77e1d102d477a51db2eb34f77ada4ca4', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'aserna3@gmail.com'}, 'message': '[Qt] Fix bolding of GraphicsChoice.cpp', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/47a2a16b77e1d102d477a51db2eb34f77ada4ca4', 'added': [], 'removed': [], 'distinct': True}, {'hash': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #6080 from Helios747/oops\n\n[Qt] Fix bolding of GraphicsChoice.cpp', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '5585ac47bf303a4cc85db743b03dd05fb8d3f983', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '10b3f02385dccf03888efd0d6a9b1e0e7871fb3d', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-09-20T15:08:35.222444	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '6c7e392f0c6b8b9dcca2f22060cf823a173552a5', 'author': {'name': 'spycrab', 'username': 'spycrab', 'email': 'spycrab@users.noreply.github.com'}, 'message': 'Qt/GraphicsSettings: Fix overriden settings not being bolded', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsBool.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsSlider.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6c7e392f0c6b8b9dcca2f22060cf823a173552a5', 'added': [], 'removed': [], 'distinct': True}, {'hash': '10b3f02385dccf03888efd0d6a9b1e0e7871fb3d', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #6078 from spycrab/qt_fix_bold\n\nQt/GraphicsSettings: Fix overriden settings not being bolded', 'modified': ['Source/Core/DolphinQt2/Config/Graphics/GraphicsBool.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsChoice.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsSlider.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/10b3f02385dccf03888efd0d6a9b1e0e7871fb3d', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '10b3f02385dccf03888efd0d6a9b1e0e7871fb3d', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'd1abd71ccb650e78e27371b19a7e7c861312b787', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-09-20T08:19:43.013340	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '6d9ed9dc324200ecf1fcddbeb0ead7db8a1bab1c', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'OGL/TextureCache: Move file statics to the TextureCache class\n\nThese rely on instance state, or are used within instance-based class\nmember functions, so they should belong to the instance itself instead\nof being file statics.', 'modified': ['Source/Core/VideoBackends/OGL/TextureCache.cpp', 'Source/Core/VideoBackends/OGL/TextureCache.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6d9ed9dc324200ecf1fcddbeb0ead7db8a1bab1c', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'dbd9aeb210ab0b1ee12001fed1214b815d35df7f', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'OGL/TextureCache: use std::array for the palette shader array', 'modified': ['Source/Core/VideoBackends/OGL/TextureCache.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/dbd9aeb210ab0b1ee12001fed1214b815d35df7f', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd1abd71ccb650e78e27371b19a7e7c861312b787', 'author': {'name': 'Markus Wick', 'username': 'degasus', 'email': 'degasus@users.noreply.github.com'}, 'message': 'Merge pull request #6070 from lioncash/ogl-tcache\n\nOGL/TextureCache: Move file statics to the TextureCache class', 'modified': ['Source/Core/VideoBackends/OGL/TextureCache.cpp', 'Source/Core/VideoBackends/OGL/TextureCache.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d1abd71ccb650e78e27371b19a7e7c861312b787', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'd1abd71ccb650e78e27371b19a7e7c861312b787', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'c9f790dca470c7800e01795210d4d19ca96e9710', 'repo': 'dolphin-emu/dolphin', 'pusher': 'degasus'}
2017-09-18T10:47:50.670705	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'b6bc3bc7c9719e052953f49b1ee23e9a32b6d79e', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': "Remove DVDInterface::ChangeDiscAsHost\n\nThere isn't much point in keeping this utility function around\nnow that RunAsCPUThread provides a simple way of running things\non the CPU thread.", 'modified': ['Source/Core/Core/HW/DVD/DVDInterface.cpp', 'Source/Core/Core/HW/DVD/DVDInterface.h', 'Source/Core/Core/Movie.cpp', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/DolphinWX/GameListCtrl.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/b6bc3bc7c9719e052953f49b1ee23e9a32b6d79e', 'added': [], 'removed': [], 'distinct': True}, {'hash': '3c770693a28daa3526ed64900641301799660b93', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DVDInterface: Remove a (mostly) outdated comment', 'modified': ['Source/Core/Core/HW/DVD/DVDInterface.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3c770693a28daa3526ed64900641301799660b93', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'e4faabb763520d57c27cfdc827ce5e5b0b896d94', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Add an option to eject the disc', 'modified': ['Source/Core/Core/HW/DVD/DVDInterface.cpp', 'Source/Core/Core/HW/DVD/DVDInterface.h', 'Source/Core/Core/HotkeyManager.cpp', 'Source/Core/Core/HotkeyManager.h', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/Frame.h', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/DolphinWX/Globals.h', 'Source/Core/DolphinWX/MainMenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/e4faabb763520d57c27cfdc827ce5e5b0b896d94', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'c9f790dca470c7800e01795210d4d19ca96e9710', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6072 from JosJuice/eject-disc\n\nAdd an option to eject the disc', 'modified': ['Source/Core/Core/HW/DVD/DVDInterface.cpp', 'Source/Core/Core/HW/DVD/DVDInterface.h', 'Source/Core/Core/HotkeyManager.cpp', 'Source/Core/Core/HotkeyManager.h', 'Source/Core/Core/Movie.cpp', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/Frame.h', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/DolphinWX/GameListCtrl.cpp', 'Source/Core/DolphinWX/Globals.h', 'Source/Core/DolphinWX/MainMenuBar.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c9f790dca470c7800e01795210d4d19ca96e9710', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'c9f790dca470c7800e01795210d4d19ca96e9710', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '1566f3ae7e8c018ccf008e825aaf7a2590f23c26', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-18T04:15:33.797816	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '43f067c6e16cbad428e2d5ec11cd3094fb14a868', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'StringUtil: support TryParse(u16*)', 'modified': ['Source/Core/Common/StringUtil.cpp', 'Source/Core/Common/StringUtil.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/43f067c6e16cbad428e2d5ec11cd3094fb14a868', 'added': [], 'removed': [], 'distinct': True}, {'hash': '1566f3ae7e8c018ccf008e825aaf7a2590f23c26', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'Merge pull request #6074 from delroth/netplay-fix\n\nFix NetPlay settings reset issue', 'modified': ['Source/Core/Common/StringUtil.cpp', 'Source/Core/Common/StringUtil.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/1566f3ae7e8c018ccf008e825aaf7a2590f23c26', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '1566f3ae7e8c018ccf008e825aaf7a2590f23c26', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'c50848be21bd0fd85f88548bca4f5ba7ab2e6924', 'repo': 'dolphin-emu/dolphin', 'pusher': 'delroth'}
2017-09-18T02:17:08.682472	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [], 'after_sha': '0000000000000000000000000000000000000000', 'ref_name': 'delroth-fix-6069', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': True, 'type': 'gh_push', 'before_sha': '3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'repo': 'dolphin-emu/dolphin', 'pusher': 'delroth'}
2017-09-18T01:33:53.019438	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'Fix sample wrapping with new DSP ADPCM decoding\n\nFixes possible regression from #6069.', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'added': [], 'removed': [], 'distinct': False}, {'hash': 'c50848be21bd0fd85f88548bca4f5ba7ab2e6924', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'Merge pull request #6073 from dolphin-emu/delroth-fix-6069\n\nFix sample wrapping with new DSP ADPCM decoding', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c50848be21bd0fd85f88548bca4f5ba7ab2e6924', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'c50848be21bd0fd85f88548bca4f5ba7ab2e6924', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '755253948b134fb253903c2def1ab0f15107a8e5', 'repo': 'dolphin-emu/dolphin', 'pusher': 'delroth'}
2017-09-18T00:55:00.292627	{'forced': False, 'base_ref_name': None, 'created': True, 'commits': [{'hash': '3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'Fix sample wrapping with new DSP ADPCM decoding\n\nFixes possible regression from #6069.', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '3f481a70beedf67c2045b297670e63e9a6b6bcb9', 'ref_name': 'delroth-fix-6069', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '0000000000000000000000000000000000000000', 'repo': 'dolphin-emu/dolphin', 'pusher': 'delroth'}
2017-09-17T21:20:40.874622	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '38a7196ec6434e28e78653190fa711d42466a806', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'DSP: Deduplicate the accelerator code\n\nThe logic is entirely the same; only the inputs and outputs are\ndifferent, so deduplicating makes sense.\n\nThis will make fixing accelerator issues easier.', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp', 'Source/Core/Core/DSP/DSPAccelerator.h', 'Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/38a7196ec6434e28e78653190fa711d42466a806', 'added': [], 'removed': [], 'distinct': True}, {'hash': '755253948b134fb253903c2def1ab0f15107a8e5', 'author': {'name': 'Pierre Bourdon', 'username': 'delroth', 'email': 'delroth@gmail.com'}, 'message': 'Merge pull request #6069 from leoetlino/common-accelerator\n\nDSP: Deduplicate the accelerator code', 'modified': ['Source/Core/Core/DSP/DSPAccelerator.cpp', 'Source/Core/Core/DSP/DSPAccelerator.h', 'Source/Core/Core/HW/DSPHLE/UCodes/AXVoice.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/755253948b134fb253903c2def1ab0f15107a8e5', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '755253948b134fb253903c2def1ab0f15107a8e5', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '29bfdbb36b29b009656f5dd6a32acb6677ebf46e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'delroth'}
2017-09-17T09:11:40.183737	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '6c326e721598f25c91a74f0e7e991f4f98c01a25', 'author': {'name': 'Lioncash', 'username': 'lioncash', 'email': 'mathew1800@gmail.com'}, 'message': 'InputConfigDiag: Fix building DolphinWX on the latest MSVC\n\nconst char[1] and wxString() can both be converted to multiple common\ntypes, so this results in an ambiguous conditional expression\ncompilation error (C2445)', 'modified': ['Source/Core/DolphinWX/Input/InputConfigDiag.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6c326e721598f25c91a74f0e7e991f4f98c01a25', 'added': [], 'removed': [], 'distinct': True}, {'hash': '29bfdbb36b29b009656f5dd6a32acb6677ebf46e', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'Merge pull request #6071 from lioncash/inputconfig\n\nInputConfigDiag: Fix building DolphinWX on the latest MSVC', 'modified': ['Source/Core/DolphinWX/Input/InputConfigDiag.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/29bfdbb36b29b009656f5dd6a32acb6677ebf46e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '29bfdbb36b29b009656f5dd6a32acb6677ebf46e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'd7aa49a1a7cac642d08c00ec42064c081f23891e', 'repo': 'dolphin-emu/dolphin', 'pusher': 'JosJuice'}
2017-09-16T21:14:13.260299	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '7022a18e9accac96e4f48f66f3234b9daf58eae2', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'IOS/SSL: Show built-in cert error once per session\n\nSee: https://bugs.dolphin-emu.org/issues/10546', 'modified': ['Source/Core/Core/IOS/Network/SSL.cpp', 'Source/Core/Core/IOS/Network/SSL.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7022a18e9accac96e4f48f66f3234b9daf58eae2', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'd7aa49a1a7cac642d08c00ec42064c081f23891e', 'author': {'name': 'Anthony', 'username': 'Helios747', 'email': 'Helios747@users.noreply.github.com'}, 'message': 'Merge pull request #6068 from leoetlino/ssl\n\nIOS/SSL: Show built-in cert error once per session', 'modified': ['Source/Core/Core/IOS/Network/SSL.cpp', 'Source/Core/Core/IOS/Network/SSL.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d7aa49a1a7cac642d08c00ec42064c081f23891e', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'd7aa49a1a7cac642d08c00ec42064c081f23891e', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '764e058865d3821b3199bc57961f90f0de75d58a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'Helios747'}
2017-09-16T14:46:46.017497	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '1e27e87d939ea19f0d2c05ceec05ee1e5802d401', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'QueueOnObject: accept pointers to member functions', 'modified': ['Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp', 'Source/Core/DolphinQt2/QtUtils/QueueOnObject.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/1e27e87d939ea19f0d2c05ceec05ee1e5802d401', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7f812a7a03d803e91c60c75102f4580196bbff28', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'RunOnObject: accept pointers to member functions', 'modified': ['Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp', 'Source/Core/DolphinQt2/QtUtils/RunOnObject.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7f812a7a03d803e91c60c75102f4580196bbff28', 'added': [], 'removed': [], 'distinct': True}, {'hash': '764e058865d3821b3199bc57961f90f0de75d58a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6063 from ligfx/queuemethodonobject\n\nQt QueueOnObject/RunOnObject: accept pointers to member functions', 'modified': ['Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp', 'Source/Core/DolphinQt2/QtUtils/QueueOnObject.h', 'Source/Core/DolphinQt2/QtUtils/RunOnObject.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/764e058865d3821b3199bc57961f90f0de75d58a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '764e058865d3821b3199bc57961f90f0de75d58a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '68baf7d8fc59f16e57040dd74c351d50cc1a039a', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T20:38:44.526700	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '6191f0452425b904d7e6100eb3bd824c11afeadf', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Settings: register the Core::State type with Qt', 'modified': ['Source/Core/DolphinQt2/Settings.cpp', 'Source/Core/DolphinQt2/Settings.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6191f0452425b904d7e6100eb3bd824c11afeadf', 'added': [], 'removed': [], 'distinct': True}, {'hash': '68baf7d8fc59f16e57040dd74c351d50cc1a039a', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6062 from ligfx/fixqtcorestate\n\nSettings: register the Core::State type with Qt', 'modified': ['Source/Core/DolphinQt2/Settings.cpp', 'Source/Core/DolphinQt2/Settings.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/68baf7d8fc59f16e57040dd74c351d50cc1a039a', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '68baf7d8fc59f16e57040dd74c351d50cc1a039a', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '93574bf016c8624e0ac38658b0beeefe5882decd', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T18:58:53.874450	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'a0cddc579f6575a00fbe79df06cb80326fb52c33', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DolphinQt2: Check for file systems being nullptr\n\nnullptr gets returned for file systems that are deemed invalid.', 'modified': ['Source/Core/DolphinQt2/Config/FilesystemWidget.cpp', 'Source/Core/DolphinQt2/Config/FilesystemWidget.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/a0cddc579f6575a00fbe79df06cb80326fb52c33', 'added': [], 'removed': [], 'distinct': True}, {'hash': '93574bf016c8624e0ac38658b0beeefe5882decd', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6064 from JosJuice/filesystemwidget-nullptr\n\nDolphinQt2: Check for file systems being nullptr', 'modified': ['Source/Core/DolphinQt2/Config/FilesystemWidget.cpp', 'Source/Core/DolphinQt2/Config/FilesystemWidget.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/93574bf016c8624e0ac38658b0beeefe5882decd', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '93574bf016c8624e0ac38658b0beeefe5882decd', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'ef6ca3c7508e696c14584c10bbc5c79d6cb01b27', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T18:56:17.273015	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '6f1b1560209d32c9678274af3fbb9d0c85cc79b5', 'author': {'name': 'Léo Lam', 'username': 'leoetlino', 'email': 'leo@innovatetechnologi.es'}, 'message': 'VolumeGC: Add a default constructor for ConvertedGCBanner\n\nWithout this, it fails to build with the following error in g++ 7.2.0:\n\n> constructor required before non-static data member has been parsed', 'modified': ['Source/Core/DiscIO/VolumeGC.cpp', 'Source/Core/DiscIO/VolumeGC.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/6f1b1560209d32c9678274af3fbb9d0c85cc79b5', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'ef6ca3c7508e696c14584c10bbc5c79d6cb01b27', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6065 from leoetlino/fix\n\nVolumeGC: Add a default constructor for ConvertedGCBanner', 'modified': ['Source/Core/DiscIO/VolumeGC.cpp', 'Source/Core/DiscIO/VolumeGC.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/ef6ca3c7508e696c14584c10bbc5c79d6cb01b27', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': 'ef6ca3c7508e696c14584c10bbc5c79d6cb01b27', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '7cb8d6612c6df51073037b56ebc866f180aecd71', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T17:30:08.169987	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '38304da947c6b593ef94449894dc018aac633344', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DiscIO: Use Common::Lazy for loading filesystems\n\nThis simplifies FileMonitor a lot and also lets us\nclean up FilesystemPanel.', 'modified': ['Source/Core/Common/Lazy.h', 'Source/Core/Core/HW/DVD/DVDThread.cpp', 'Source/Core/Core/HW/DVD/FileMonitor.cpp', 'Source/Core/Core/HW/DVD/FileMonitor.h', 'Source/Core/Core/WiiUtils.cpp', 'Source/Core/DiscIO/DiscExtractor.cpp', 'Source/Core/DiscIO/DiscExtractor.h', 'Source/Core/DiscIO/DiscScrubber.cpp', 'Source/Core/DiscIO/Filesystem.cpp', 'Source/Core/DiscIO/Filesystem.h', 'Source/Core/DiscIO/Volume.h', 'Source/Core/DiscIO/VolumeFileBlobReader.cpp', 'Source/Core/DiscIO/VolumeFileBlobReader.h', 'Source/Core/DiscIO/VolumeGC.cpp', 'Source/Core/DiscIO/VolumeGC.h', 'Source/Core/DiscIO/VolumeWad.cpp', 'Source/Core/DiscIO/VolumeWad.h', 'Source/Core/DiscIO/VolumeWii.cpp', 'Source/Core/DiscIO/VolumeWii.h', 'Source/Core/DolphinWX/ISOProperties/FilesystemPanel.cpp', 'Source/Core/DolphinWX/ISOProperties/FilesystemPanel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/38304da947c6b593ef94449894dc018aac633344', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'ca36c977d9617ba188907bbe2ff2922fce121972', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DiscIO: Remove m_partition and m_volume from FileSystem\n\nThe last commit made m_partition unnecessary, and m_volume\nhas been unnecessary ever since the PR that added DiscExtractor.', 'modified': ['Source/Core/DiscIO/FileSystemGCWii.cpp', 'Source/Core/DiscIO/Filesystem.cpp', 'Source/Core/DiscIO/Filesystem.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/ca36c977d9617ba188907bbe2ff2922fce121972', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'f294599e734f2391db9e74b6454752e75fdf368c', 'author': {'name': 'JosJuice', 'username': 'JosJuice', 'email': 'josjuice@gmail.com'}, 'message': 'DiscIO: Use Common::Lazy for loading GC banners', 'modified': ['Source/Core/DiscIO/VolumeGC.cpp', 'Source/Core/DiscIO/VolumeGC.h', 'Source/Core/DolphinQt2/Config/FilesystemWidget.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/f294599e734f2391db9e74b6454752e75fdf368c', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7cb8d6612c6df51073037b56ebc866f180aecd71', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5870 from JosJuice/lazy-filesystem\n\nDiscIO: Use Common::Lazy more', 'modified': ['Source/Core/Common/Lazy.h', 'Source/Core/Core/HW/DVD/DVDThread.cpp', 'Source/Core/Core/HW/DVD/FileMonitor.cpp', 'Source/Core/Core/HW/DVD/FileMonitor.h', 'Source/Core/Core/WiiUtils.cpp', 'Source/Core/DiscIO/DiscExtractor.cpp', 'Source/Core/DiscIO/DiscExtractor.h', 'Source/Core/DiscIO/DiscScrubber.cpp', 'Source/Core/DiscIO/FileSystemGCWii.cpp', 'Source/Core/DiscIO/Filesystem.cpp', 'Source/Core/DiscIO/Filesystem.h', 'Source/Core/DiscIO/Volume.h', 'Source/Core/DiscIO/VolumeFileBlobReader.cpp', 'Source/Core/DiscIO/VolumeFileBlobReader.h', 'Source/Core/DiscIO/VolumeGC.cpp', 'Source/Core/DiscIO/VolumeGC.h', 'Source/Core/DiscIO/VolumeWad.cpp', 'Source/Core/DiscIO/VolumeWad.h', 'Source/Core/DiscIO/VolumeWii.cpp', 'Source/Core/DiscIO/VolumeWii.h', 'Source/Core/DolphinQt2/Config/FilesystemWidget.cpp', 'Source/Core/DolphinWX/ISOProperties/FilesystemPanel.cpp', 'Source/Core/DolphinWX/ISOProperties/FilesystemPanel.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7cb8d6612c6df51073037b56ebc866f180aecd71', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '7cb8d6612c6df51073037b56ebc866f180aecd71', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '7caf44c8b5a8a435ad1d9db3b2444db614d329eb', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T17:28:06.450842	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '79a646a67de7faa3826ffe480226fc25b4a900d5', 'author': {'name': 'Arthur Carlsson', 'username': 'arthurc', 'email': 'arthur@kiron.net'}, 'message': "Prevent multiple HID elements of same usage type on OSX\n\nOn OSX, iterate the HID device's elements and only store the last of\neach type to accommodate for flaky hardware", 'modified': ['Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/79a646a67de7faa3826ffe480226fc25b4a900d5', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7caf44c8b5a8a435ad1d9db3b2444db614d329eb', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5732 from arthurc/fix-multiple-axis-inputs\n\nPrevent multiple HID elements of same usage type on OSX', 'modified': ['Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7caf44c8b5a8a435ad1d9db3b2444db614d329eb', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '7caf44c8b5a8a435ad1d9db3b2444db614d329eb', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '2b4bf8662a18b8b3a49e67133f3e2e2fa45322b6', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T17:11:59.849049	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'd2821e14fa9735ece3be6eec9d6bdf4cf96c1280', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ParseExpression: return a std::pair', 'modified': ['Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d2821e14fa9735ece3be6eec9d6bdf4cf96c1280', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'bbb7c1723569b1f897041851f97a46327a302e48', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: use internal ParseResult struct instead of out-params', 'modified': ['Source/Core/InputCommon/ControlReference/ExpressionParser.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/bbb7c1723569b1f897041851f97a46327a302e48', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'c33e391d267223fad8f9f6841c2729668b11da3c', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "InputConfigDiag: don't use entire ExpressionParse namespace", 'modified': ['Source/Core/DolphinWX/Input/InputConfigDiag.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c33e391d267223fad8f9f6841c2729668b11da3c', 'added': [], 'removed': [], 'distinct': True}, {'hash': '3df945f8d0c34677b009c210dd0400b2e9655024', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: replace bare pointers with unique_ptrs', 'modified': ['Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3df945f8d0c34677b009c210dd0400b2e9655024', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'f1ff1e3d084c1dd8ae28f2dd8cc409949e378334', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: clean up ControlExpression', 'modified': ['Source/Core/InputCommon/ControlReference/ExpressionParser.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/f1ff1e3d084c1dd8ae28f2dd8cc409949e378334', 'added': [], 'removed': [], 'distinct': True}, {'hash': '754efd75c5f8b843e25f2ff8510bfc2a25fd1de1', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: remove DummyExpression', 'modified': ['Source/Core/InputCommon/ControlReference/ExpressionParser.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/754efd75c5f8b843e25f2ff8510bfc2a25fd1de1', 'added': [], 'removed': [], 'distinct': True}, {'hash': '85301e2baeda9a97c4c5ebbf07807566831e22d1', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ParseStatus: replace NoDevice with EmptyExpression', 'modified': ['Source/Core/DolphinWX/Input/InputConfigDiag.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/85301e2baeda9a97c4c5ebbf07807566831e22d1', 'added': [], 'removed': [], 'distinct': True}, {'hash': '7e74961eb150f28a56405403335f4904f888e058', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: expose ExpressionNode directly', 'modified': ['Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/7e74961eb150f28a56405403335f4904f888e058', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'ba87a503389a6db8e4ddae5a87f9d1ebc52db46a', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: add FallbackExpression node type', 'modified': ['Source/Core/InputCommon/ControlReference/ExpressionParser.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/ba87a503389a6db8e4ddae5a87f9d1ebc52db46a', 'added': [], 'removed': [], 'distinct': True}, {'hash': 'c332580b83ea8cd5650d53378843ceadcbfeb9cb', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ControlReference/ExpressionParser: separate parsing from binding', 'modified': ['Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/c332580b83ea8cd5650d53378843ceadcbfeb9cb', 'added': [], 'removed': [], 'distinct': True}, {'hash': '31f1c062264fcf8628e3a13c44de893d4bac0aa0', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': "ControlReference: don't reparse expression when references are updated", 'modified': ['Source/Core/Core/HotkeyManager.cpp', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp', 'Source/Core/DolphinWX/Input/InputConfigDiag.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.h', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/31f1c062264fcf8628e3a13c44de893d4bac0aa0', 'added': [], 'removed': [], 'distinct': True}, {'hash': '294b1895ef2963cfc6fda1818d9a9f3b8b0af48f', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'ExpressionParser: std::move() tokens vector to parser', 'modified': ['Source/Core/InputCommon/ControlReference/ExpressionParser.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/294b1895ef2963cfc6fda1818d9a9f3b8b0af48f', 'added': [], 'removed': [], 'distinct': True}, {'hash': '2b4bf8662a18b8b3a49e67133f3e2e2fa45322b6', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5577 from ligfx/separateexpressionparsingandbinding\n\nControlReference/ExpressionParser: separate parsing from binding', 'modified': ['Source/Core/Core/HotkeyManager.cpp', 'Source/Core/DolphinQt2/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt2/Config/Mapping/MappingButton.cpp', 'Source/Core/DolphinWX/Input/InputConfigDiag.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.h', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.h', 'Source/Core/InputCommon/ControllerEmu/ControlGroup/ControlGroup.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/2b4bf8662a18b8b3a49e67133f3e2e2fa45322b6', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '2b4bf8662a18b8b3a49e67133f3e2e2fa45322b6', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '0d078219358b04266206ea1e2622396db7724136', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T16:45:19.466150	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': 'd217e797f29b2d727bd7a45dcacd15603b739aa6', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'move Movie::DoFrameStep to Core::DoFrameStep', 'modified': ['Source/Core/Core/Core.cpp', 'Source/Core/Core/Core.h', 'Source/Core/Core/Movie.cpp', 'Source/Core/Core/Movie.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinWX/FrameTools.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/d217e797f29b2d727bd7a45dcacd15603b739aa6', 'added': [], 'removed': [], 'distinct': True}, {'hash': '22a9a08b2454b48ea017e8733e69caf63f3717dd', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Add Core::State::Starting', 'modified': ['Source/Core/Core/Core.cpp', 'Source/Core/Core/Core.h', 'Source/Core/InputCommon/GCAdapter.cpp', 'Source/Core/InputCommon/GCAdapter_Android.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/22a9a08b2454b48ea017e8733e69caf63f3717dd', 'added': [], 'removed': [], 'distinct': True}, {'hash': '8e805dcbf43505aaf5b9af06f6f23159f3c083e4', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Core: SetOnStoppedCallback -> SetOnStateChangedCallback', 'modified': ['Source/Core/Core/Core.cpp', 'Source/Core/Core/Core.h', 'Source/Core/DolphinNoGUI/MainNoGUI.cpp', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinWX/Frame.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/8e805dcbf43505aaf5b9af06f6f23159f3c083e4', 'added': [], 'removed': [], 'distinct': True}, {'hash': '3e1072b24dd8f60fd13b9aca3527066d478f9774', 'author': {'name': 'Michael M', 'username': 'ligfx', 'email': 'mchtly@gmail.com'}, 'message': 'Qt: use Settings::EmulationStateChanged', 'modified': ['Source/Core/DolphinQt2/Config/ControllersWindow.cpp', 'Source/Core/DolphinQt2/Config/ControllersWindow.h', 'Source/Core/DolphinQt2/Config/Graphics/AdvancedWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GeneralWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWindow.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWindow.h', 'Source/Core/DolphinQt2/Config/SettingsWindow.cpp', 'Source/Core/DolphinQt2/Config/SettingsWindow.h', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h', 'Source/Core/DolphinQt2/Settings.cpp', 'Source/Core/DolphinQt2/Settings.h', 'Source/Core/DolphinQt2/Settings/AudioPane.cpp', 'Source/Core/DolphinQt2/Settings/AudioPane.h', 'Source/Core/DolphinQt2/ToolBar.cpp', 'Source/Core/DolphinQt2/ToolBar.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/3e1072b24dd8f60fd13b9aca3527066d478f9774', 'added': [], 'removed': [], 'distinct': True}, {'hash': '0d078219358b04266206ea1e2622396db7724136', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #6024 from ligfx/coreonstatechangedcallback\n\nQt: use Settings::EmulationStateChanged', 'modified': ['Source/Core/Core/Core.cpp', 'Source/Core/Core/Core.h', 'Source/Core/Core/Movie.cpp', 'Source/Core/Core/Movie.h', 'Source/Core/DolphinNoGUI/MainNoGUI.cpp', 'Source/Core/DolphinQt2/Config/ControllersWindow.cpp', 'Source/Core/DolphinQt2/Config/ControllersWindow.h', 'Source/Core/DolphinQt2/Config/Graphics/AdvancedWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GeneralWidget.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWindow.cpp', 'Source/Core/DolphinQt2/Config/Graphics/GraphicsWindow.h', 'Source/Core/DolphinQt2/Config/SettingsWindow.cpp', 'Source/Core/DolphinQt2/Config/SettingsWindow.h', 'Source/Core/DolphinQt2/GameList/GameList.cpp', 'Source/Core/DolphinQt2/GameList/GameList.h', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h', 'Source/Core/DolphinQt2/MenuBar.cpp', 'Source/Core/DolphinQt2/MenuBar.h', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.cpp', 'Source/Core/DolphinQt2/NetPlay/NetPlayDialog.h', 'Source/Core/DolphinQt2/Settings.cpp', 'Source/Core/DolphinQt2/Settings.h', 'Source/Core/DolphinQt2/Settings/AudioPane.cpp', 'Source/Core/DolphinQt2/Settings/AudioPane.h', 'Source/Core/DolphinQt2/ToolBar.cpp', 'Source/Core/DolphinQt2/ToolBar.h', 'Source/Core/DolphinWX/Frame.cpp', 'Source/Core/DolphinWX/FrameTools.cpp', 'Source/Core/InputCommon/GCAdapter.cpp', 'Source/Core/InputCommon/GCAdapter_Android.cpp'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/0d078219358b04266206ea1e2622396db7724136', 'added': [], 'removed': [], 'distinct': True}], 'after_sha': '0d078219358b04266206ea1e2622396db7724136', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': '30dd544931575f5136bc4a5cc972d0f3c55979c5', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}
2017-09-15T16:30:47.584590	{'forced': False, 'base_ref_name': None, 'created': False, 'commits': [{'hash': '48d57f223d52d4dd630ae9fc1e7c15c2d576e305', 'author': {'name': 'spycrab', 'username': 'spycrab', 'email': 'spycrab@users.noreply.github.com'}, 'message': 'Qt: Make Log and Log Configuration widget separate', 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/48d57f223d52d4dd630ae9fc1e7c15c2d576e305', 'added': ['Source/Core/DolphinQt2/Config/LogConfigWidget.cpp', 'Source/Core/DolphinQt2/Config/LogConfigWidget.h', 'Source/Core/DolphinQt2/Config/LogWidget.cpp', 'Source/Core/DolphinQt2/Config/LogWidget.h'], 'removed': ['Source/Core/DolphinQt2/Config/LoggerWidget.cpp', 'Source/Core/DolphinQt2/Config/LoggerWidget.h'], 'distinct': True}, {'hash': '30dd544931575f5136bc4a5cc972d0f3c55979c5', 'author': {'name': 'Leo Lam', 'username': 'leoetlino', 'email': 'leolino.lam@gmail.com'}, 'message': 'Merge pull request #5990 from spycrab/qt_logger_cleanup\n\nQt: Make Log and Log Configuration widget separate from dock', 'modified': ['Source/Core/DolphinQt2/CMakeLists.txt', 'Source/Core/DolphinQt2/DolphinQt2.vcxproj', 'Source/Core/DolphinQt2/MainWindow.cpp', 'Source/Core/DolphinQt2/MainWindow.h'], 'url': 'https://github.com/dolphin-emu/dolphin/commit/30dd544931575f5136bc4a5cc972d0f3c55979c5', 'added': ['Source/Core/DolphinQt2/Config/LogConfigWidget.cpp', 'Source/Core/DolphinQt2/Config/LogConfigWidget.h', 'Source/Core/DolphinQt2/Config/LogWidget.cpp', 'Source/Core/DolphinQt2/Config/LogWidget.h'], 'removed': ['Source/Core/DolphinQt2/Config/LoggerWidget.cpp', 'Source/Core/DolphinQt2/Config/LoggerWidget.h'], 'distinct': True}], 'after_sha': '30dd544931575f5136bc4a5cc972d0f3c55979c5', 'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'deleted': False, 'type': 'gh_push', 'before_sha': 'ac2f59c1b549c5e045196bcbecb667e38d88f129', 'repo': 'dolphin-emu/dolphin', 'pusher': 'leoetlino'}

Recent 'internal_log' events

2017-09-25T07:45:33.343249	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:32.881126	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:32.878888	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 132, 'level': 'INFO', 'args': "('dolphin-emu', 'core-developers')", 'msg': 'Refreshing list of trusted users (from %s/%s)', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:12.046795	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 147, 'level': 'INFO', 'args': "('dolphin-emu/trusted-developers', 'leoetlino,LPFaint99,spxtr,kamiyo,Armada651,degasus,JMC47,NanoByte011,sepalani,linkmauve,Sonicadvance1,stenzek,EmptyChaos,aroulin,Ziek,Ryanel,RachelBryk,shuffle2,comex,LAGonauta,Sintendo,Aestek,Helios747,Buddybenj,Starsam80,magcius,magumagu,Zopieux,mathieui,FioraAeterna,iwubcode,glennricster,JosJuice,delroth,lioncash,Tinob,rukai,aldelaro5,Tilka,meffij,AdmiralCurtiss,BhaaLseN,vladfi1,Parlane,Alcaro,mmastrac,Orphis,jezze,ligfx,skidau,moncefmechri,randomstuff,OrN,JonnyH,adamdmoss,PEmu1,bentley,neobrain,absolome,kayru,endrift,cylgom,Stevoisiak,spycrab,unknownbrackets,marcan,jordan-woyak,RisingFog,SeannyM,mahdihijazi,booto,clinchergt,phire,hthh,hrydgard,galop1n,MerryMage,jloehr,MayImilae,hdcmeta,mrgreywater,Phatcat,archshift,rohit-n,Linktothepast,sigmabeta,mimimi085181')", 'msg': 'New GH %s: %s', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:11.487656	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:10.968883	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:10.419603	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:09.983107	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:45:09.981078	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 132, 'level': 'INFO', 'args': "('dolphin-emu', 'trusted-developers')", 'msg': 'Refreshing list of trusted users (from %s/%s)', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.665346	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.664460	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/gcdsp-ida' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:11.200983	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.720543	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.718361	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/hwtests' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:10.244173	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.757532	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.755295	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/www' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:09.231813	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.746006	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.743656	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/sadm' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:08.226085	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.711843	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.709628	{'pathname': '/home/central/sadm/central/github.py', 'lineno': 196, 'level': 'INFO', 'args': '()', 'msg': "Watched repo 'dolphin-emu/redmine' has our hook installed", 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:07.208687	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}
2017-09-25T07:41:06.700204	{'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'lineno': 657, 'level': 'INFO', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com', 'source': 'logging', 'type': 'internal_log'}

Recent 'irc_message' events

2017-09-25T07:16:08.911030	{'what': 'but seriously, gonna be a huge progress report to say 4 (including Red Steel/Far Cry?) games no longer hanging plus tons of other audio issues fixed', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T07:15:17.035060	{'what': "leoetlino: next up... make Dolphin's SD card reading faster ;)", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T07:14:27.093054	{'what': 'JMC47: yep :D', 'who': 'leoetlino', 'type': 'irc_message', 'modes': {'o'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T06:01:54.613860	{'what': "Yup, after that, I'll head to bed :D", 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T06:00:54.736369	{'what': "let's see how HybridXFB acts", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T06:00:09.166431	{'what': "I don't know why I didn't think of trying that sooner", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:56.120888	{'what': "Whut, that's crazy", 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:42.661776	{'what': 'including double strike', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:38.619808	{'what': 'and has every major video mode', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:33.965458	{'what': "Nintendo's special demo disc (Peach's Castle) allows you to switch video modes live", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:25.787323	{'what': "What's that?", 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:12.119075	{'what': "there's something else I can throw at it", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:08.010763	{'what': 'Yup', 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:07.820169	{'what': 'iwubcode: oh', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:59:02.944417	{'what': 'Well, progress is progress', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:58:39.182637	{'what': 'Yeah...', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:58:06.833173	{'what': "Yup, they are strange.  They have horizontal scaling but I still don't know if I need to do anything with that.  Especially since master avoids it completely :/", 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:57:08.128733	{'what': 'that act weird', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:57:06.149547	{'what': "It's just the FMVs in Sonic 3D Blast", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:56:57.854567	{'what': "I don't know why", 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:56:20.789736	{'what': "Oh geeze, I didn't know that :O", 'who': 'iwubcode', 'type': 'irc_message', 'modes': set(), 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:55:14.152697	{'what': 'idk', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:55:13.400270	{'what': 'One is Strided XFB copies (Sonic 3?) and the other is... Scaling?  + Strided?', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:54:58.324970	{'what': 'Sonic 3 and Knuckles and Sonic 3D Blast are two different things', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}
2017-09-25T05:54:49.397817	{'what': 'The thing is', 'who': 'JMC47', 'type': 'irc_message', 'modes': {'v'}, 'where': '#dolphin-dev', 'direct': False, 'source': 'ircclient'}

Recent 'issue' events

2017-09-24T22:03:44.806761	{'update': 7, 'author': 'leoetlino', 'issue': 10544, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Streaming Audio Issues Across Many GameCube Titles'}
2017-09-22T14:20:04.168539	{'update': 14, 'author': 'Stenzek', 'issue': 10535, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan Vertex Rounding broken by 5.0-5419'}
2017-09-22T13:55:07.740344	{'update': 13, 'author': 'LuismaSP', 'issue': 10535, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan Vertex Rounding broken by 5.0-5419'}
2017-09-22T04:47:22.696716	{'update': 1, 'author': 'Stenzek', 'issue': 10555, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Disabling emulation speed while using Vulkan and Vsync in fullscreen causes entire emulator window to briefly flash black and create other visual errors(this effects overlays too)'}
2017-09-22T03:50:17.353725	{'update': 0, 'author': 'garbageboy', 'issue': 10555, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Disabling emulation speed while using Vulkan and Vsync in fullscreen causes entire emulator window to briefly flash black and create other visual errors(this effects overlays too)'}
2017-09-21T08:15:05.590423	{'update': 7, 'author': 'JMC4789', 'issue': 10514, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'SDHC read times are very slow'}
2017-09-21T06:41:08.255194	{'update': 6, 'author': 'TheGag96', 'issue': 10514, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'SDHC read times are very slow'}
2017-09-20T03:01:45.470614	{'update': 4, 'author': 'Helios', 'issue': 10552, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan presentation modes issue'}
2017-09-20T02:50:10.975303	{'update': 3, 'author': 'Stenzek', 'issue': 10552, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan presentation modes issue'}
2017-09-19T23:56:11.651583	{'update': 0, 'author': 'JMC4789', 'issue': 10554, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': "Disney's Hide and Sneak/Disney's Mickey & Minnie Trick & Chase needs Bounding Box + EFB Copies to RAM"}
2017-09-19T23:00:20.333448	{'update': 0, 'author': 'Guitarkory1', 'issue': 10553, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Rumble support doesnt work for certain games'}
2017-09-19T20:00:03.635962	{'update': 6, 'author': 'leoetlino', 'issue': 10544, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Streaming Audio Issues Across Many GameCube Titles'}
2017-09-19T16:33:15.308715	{'update': 2, 'author': 'markk', 'issue': 10552, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan presentation modes issue'}
2017-09-19T15:13:30.066750	{'update': 12, 'author': 'markwest76', 'issue': 10535, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan Vertex Rounding broken by 5.0-5419'}
2017-09-19T15:04:59.951415	{'update': 1, 'author': 'Stenzek', 'issue': 10552, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan presentation modes issue'}
2017-09-19T14:11:21.868461	{'update': 0, 'author': 'markk', 'issue': 10552, 'type': 'issue', 'new': True, 'source': 'redmine', 'title': 'Vulkan presentation modes issue'}
2017-09-19T13:38:01.631273	{'update': 11, 'author': 'Stenzek', 'issue': 10535, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan Vertex Rounding broken by 5.0-5419'}
2017-09-19T12:16:52.472044	{'update': 10, 'author': 'FireNX70', 'issue': 10535, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Vulkan Vertex Rounding broken by 5.0-5419'}
2017-09-18T20:47:53.856370	{'update': 8, 'author': 'JMC4789', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:47:27.614607	{'update': 7, 'author': 'JMC4789', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:40:45.369867	{'update': 6, 'author': 'DolphinZocker', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:36:39.854195	{'update': 5, 'author': 'DolphinZocker', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:30:24.086849	{'update': 4, 'author': 'JMC4789', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:29:28.003389	{'update': 3, 'author': 'JMC4789', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}
2017-09-18T20:27:30.823523	{'update': 2, 'author': 'DolphinZocker', 'issue': 10547, 'type': 'issue', 'new': False, 'source': 'redmine', 'title': 'Feature Request - Show Hosted Netplay Games'}

Recent 'pull_request_fifoci_status' events

2017-09-24T22:44:13.414725	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'pull_request_fifoci_status'}
2017-09-24T22:39:24.420276	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'type': 'pull_request_fifoci_status'}
2017-09-24T20:56:50.442013	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'pull_request_fifoci_status'}
2017-09-24T20:52:11.627653	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'a0fe55918a63caa74ce47a72e9c69019b4e3e78f', 'type': 'pull_request_fifoci_status'}
2017-09-24T18:59:56.871192	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '648477692001fa2809c6509e7e1b5da03e741efe', 'type': 'pull_request_fifoci_status'}
2017-09-24T18:55:02.333017	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '648477692001fa2809c6509e7e1b5da03e741efe', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:39:49.690503	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'bee862bf59547daaa7aabe41deff2eea231b5ebd', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:35:02.550356	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'bee862bf59547daaa7aabe41deff2eea231b5ebd', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:23:13.735885	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:16:40.188519	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '6d3313bc5b5332dc6be6f0b0b6370bef4a5f97cc', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:13:18.731397	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '07f1285117df528735f4e79f3ac47d4099696bb8', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:04:15.162206	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '3fdbfe78189c1c01d013e3fa43ddd5f561ae6e69', 'type': 'pull_request_fifoci_status'}
2017-09-24T15:02:56.210299	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '07f1285117df528735f4e79f3ac47d4099696bb8', 'type': 'pull_request_fifoci_status'}
2017-09-24T14:59:14.519971	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6075, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '3fdbfe78189c1c01d013e3fa43ddd5f561ae6e69', 'type': 'pull_request_fifoci_status'}
2017-09-24T11:33:22.163824	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 5978, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'b4b75f0d82073a4a476da6a51351596d3886b8cb', 'type': 'pull_request_fifoci_status'}
2017-09-24T11:28:34.074828	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 5978, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': 'b4b75f0d82073a4a476da6a51351596d3886b8cb', 'type': 'pull_request_fifoci_status'}
2017-09-24T09:44:19.833528	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'pull_request_fifoci_status'}
2017-09-24T09:39:20.395178	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '029cdeec61598579a521e56c6206e15469e1eebd', 'type': 'pull_request_fifoci_status'}
2017-09-22T20:26:27.808331	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '3dc4d1a7d1997fde5b4922949a667017699b6260', 'type': 'pull_request_fifoci_status'}
2017-09-22T20:21:33.402644	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6077, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '3dc4d1a7d1997fde5b4922949a667017699b6260', 'type': 'pull_request_fifoci_status'}
2017-09-21T14:03:09.877355	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6084, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '85ab968136a3e144f51d864345f866806f7f7cae', 'type': 'pull_request_fifoci_status'}
2017-09-21T13:58:12.296422	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6084, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '85ab968136a3e144f51d864345f866806f7f7cae', 'type': 'pull_request_fifoci_status'}
2017-09-21T09:18:40.202722	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6076, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'pull_request_fifoci_status'}
2017-09-21T09:13:40.039127	{'service': 'pr-fifoci-sw-lin-mesa', 'pr': 6076, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '6031fe5e126c5ed6325e3a8b7fa107d1ae2e675e', 'type': 'pull_request_fifoci_status'}
2017-09-21T04:47:14.340064	{'service': 'pr-fifoci-ogl-lin-mesa', 'pr': 6083, 'source': 'buildbot', 'repo': 'dolphin-emu/dolphin', 'hash': '22600635546848ade58fc3d95067f1686646ce46', 'type': 'pull_request_fifoci_status'}

Recent 'raw_bb_hook' events

2017-09-24T22:44:12.269097	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 617, 'results': 0, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/617', 'builderid': 30, 'buildid': 9656, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 30, 'priority': 0, 'complete_at': None, 'buildrequestid': 12887, 'claimed_at': 1506292808, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506293052, 'buildrequestid': 12887, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-mesa', 'builderid': 30, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'workername': ['arch64', 'Worker'], 'shortrev': ['491255', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/pr-fifoci-ogl-lin-mesa', 'worker'], 'warnings-count': [7, 'WarningCountingShellCommand'], 'pr_id': [6075, 'Trigger'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'buildnumber': [617, 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:39:23.231364	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 617, 'results': 0, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/617', 'builderid': 17, 'buildid': 9657, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 17, 'priority': 0, 'complete_at': None, 'buildrequestid': 12885, 'claimed_at': 1506292403, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292763, 'buildrequestid': 12885, 'builder': {'masterids': [1], 'name': 'pr-fifoci-sw-lin-mesa', 'builderid': 17, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'workername': ['arch64', 'Worker'], 'shortrev': ['491255', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/pr-fifoci-sw-lin-mesa', 'worker'], 'warnings-count': [7, 'WarningCountingShellCommand'], 'pr_id': [6075, 'Trigger'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'buildnumber': [617, 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:39:07.070761	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 661, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/661', 'builderid': 7, 'buildid': 9661, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 7, 'priority': 0, 'complete_at': None, 'buildrequestid': 12876, 'claimed_at': 1506292593, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292747, 'buildrequestid': 12876, 'builder': {'masterids': [1], 'name': 'pr-win-dbg-x64', 'builderid': 7, 'description': None, 'tags': []}, 'started_at': 1506292594, 'properties': {'slavename': ['windows', 'Worker (deprecated)'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-6075-dolphin-latest-dbg-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'shortrev': ['491255', 'try build'], 'builddir': ['C:\\buildbot\\pr-win-dbg-x64', 'worker'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'buildnumber': [661, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:37:15.586990	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 660, 'results': 0, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/660', 'builderid': 21, 'buildid': 9660, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 21, 'priority': 0, 'complete_at': None, 'buildrequestid': 12879, 'claimed_at': 1506292466, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292636, 'buildrequestid': 12879, 'builder': {'masterids': [1], 'name': 'pr-deb-dbg-x64', 'builderid': 21, 'description': None, 'tags': []}, 'started_at': 1506292467, 'properties': {'workername': ['debian', 'Worker'], 'codebase': ['', 'Build'], 'slavename': ['debian', 'Worker (deprecated)'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [660, 'Build'], 'shortrev': ['491255', 'try build'], 'builddir': ['/home/delroth/buildslave/pr-deb-dbg-x64', 'worker'], 'warnings-count': [7, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:36:33.817490	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 661, 'results': None, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/661', 'builderid': 7, 'buildid': 9661, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 7, 'priority': 0, 'complete_at': None, 'buildrequestid': 12876, 'claimed_at': 1506292593, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12876, 'builder': {'masterids': [1], 'name': 'pr-win-dbg-x64', 'builderid': 7, 'description': None, 'tags': []}, 'started_at': 1506292594, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [661, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:36:33.622564	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 662, 'results': 0, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/662', 'builderid': 20, 'buildid': 9653, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 20, 'priority': 0, 'complete_at': None, 'buildrequestid': 12878, 'claimed_at': 1506292290, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292594, 'buildrequestid': 12878, 'builder': {'masterids': [1], 'name': 'pr-win-x64', 'builderid': 20, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'slavename': ['windows', 'Worker (deprecated)'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-win-x64', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-6075-dolphin-latest-x64.7z', 'SetProperty'], 'workername': ['windows', 'Worker'], 'shortrev': ['491255', 'try build'], 'builddir': ['C:\\buildbot\\pr-win-x64', 'worker'], 'warnings-count': [0, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'buildnumber': [662, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:35:42.020370	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 668, 'results': 0, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/668', 'builderid': 8, 'buildid': 9659, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 8, 'priority': 0, 'complete_at': None, 'buildrequestid': 12877, 'claimed_at': 1506292404, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292542, 'buildrequestid': 12877, 'builder': {'masterids': [1], 'name': 'pr-android', 'builderid': 8, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'buildername': ['pr-android', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'workername': ['ubuntu', 'Worker'], 'shortrev': ['491255', 'try build'], 'builddir': ['/var/lib/buildbot/slave/pr-android', 'worker'], 'buildnumber': [668, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:34:56.071639	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 659, 'results': 0, 'workerid': 1, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/659', 'builderid': 33, 'buildid': 9650, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 33, 'priority': 0, 'complete_at': None, 'buildrequestid': 12881, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292496, 'buildrequestid': 12881, 'builder': {'masterids': [1], 'name': 'pr-osx-x64', 'builderid': 33, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'workername': ['osx', 'Worker'], 'codebase': ['', 'Build'], 'slavename': ['osx', 'Worker (deprecated)'], 'buildername': ['pr-osx-x64', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [659, 'Build'], 'shortrev': ['491255', 'try build'], 'builddir': ['/Users/osxguest/buildslave/pr-osx-x64', 'worker'], 'warnings-count': [2, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:34:28.438665	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 660, 'results': None, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/660', 'builderid': 21, 'buildid': 9660, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 21, 'priority': 0, 'complete_at': None, 'buildrequestid': 12879, 'claimed_at': 1506292466, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12879, 'builder': {'masterids': [1], 'name': 'pr-deb-dbg-x64', 'builderid': 21, 'description': None, 'tags': []}, 'started_at': 1506292467, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [660, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:34:26.800998	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 661, 'results': 0, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/661', 'builderid': 6, 'buildid': 9652, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 6, 'priority': 0, 'complete_at': None, 'buildrequestid': 12875, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292467, 'buildrequestid': 12875, 'builder': {'masterids': [1], 'name': 'pr-deb-x64', 'builderid': 6, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'workername': ['debian', 'Worker'], 'codebase': ['', 'Build'], 'slavename': ['debian', 'Worker (deprecated)'], 'buildername': ['pr-deb-x64', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [661, 'Build'], 'shortrev': ['491255', 'try build'], 'builddir': ['/home/delroth/buildslave/pr-deb-x64', 'worker'], 'warnings-count': [7, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:35.131333	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 617, 'results': 2, 'workerid': 11, 'url': 'https://buildbot.dolphin-emu.org/#builders/4/builds/617', 'builderid': 4, 'buildid': 9658, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 4, 'priority': 0, 'complete_at': None, 'buildrequestid': 12883, 'claimed_at': 1506292403, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292415, 'buildrequestid': 12883, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-intel', 'builderid': 4, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'slavename': ['delroth-nuc', 'Worker (deprecated)'], 'buildername': ['pr-fifoci-ogl-lin-intel', 'Builder'], 'project': ['', 'Build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'workername': ['delroth-nuc', 'Worker'], 'shortrev': ['491255', 'Trigger'], 'builddir': ['/data/buildslave/buildslave/pr-fifoci-ogl-lin-intel', 'worker'], 'buildnumber': [617, 'Build'], 'pr_id': [6075, 'Trigger'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:24.638242	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 668, 'results': None, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/668', 'builderid': 8, 'buildid': 9659, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 8, 'priority': 0, 'complete_at': None, 'buildrequestid': 12877, 'claimed_at': 1506292404, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12877, 'builder': {'masterids': [1], 'name': 'pr-android', 'builderid': 8, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-android', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [668, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:24.474762	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 617, 'results': None, 'workerid': 11, 'url': 'https://buildbot.dolphin-emu.org/#builders/4/builds/617', 'builderid': 4, 'buildid': 9658, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 4, 'priority': 0, 'complete_at': None, 'buildrequestid': 12883, 'claimed_at': 1506292403, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12883, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-intel', 'builderid': 4, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'buildername': ['pr-fifoci-ogl-lin-intel', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'Trigger'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'buildnumber': [617, 'Build'], 'branch': ['refs/pull/6075/head', 'Build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'pr_id': [6075, 'Trigger']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:24.391919	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 617, 'results': None, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/617', 'builderid': 17, 'buildid': 9657, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 17, 'priority': 0, 'complete_at': None, 'buildrequestid': 12885, 'claimed_at': 1506292403, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12885, 'builder': {'masterids': [1], 'name': 'pr-fifoci-sw-lin-mesa', 'builderid': 17, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'Trigger'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'buildnumber': [617, 'Build'], 'branch': ['refs/pull/6075/head', 'Build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'pr_id': [6075, 'Trigger']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:24.359604	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 617, 'results': None, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/617', 'builderid': 30, 'buildid': 9656, 'buildrequest': {'results': -1, 'submitted_at': 1506292403, 'claimed_by_masterid': 1, 'buildsetid': 3616, 'builderid': 30, 'priority': 0, 'complete_at': None, 'buildrequestid': 12887, 'claimed_at': 1506292403, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12887, 'builder': {'masterids': [1], 'name': 'pr-fifoci-ogl-lin-mesa', 'builderid': 30, 'description': None, 'tags': []}, 'started_at': 1506292404, 'properties': {'codebase': ['', 'Build'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'Trigger'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Trigger'], 'buildnumber': [617, 'Build'], 'branch': ['refs/pull/6075/head', 'Build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'Build'], 'pr_id': [6075, 'Trigger']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506292403, 'parent_buildid': 9655, 'bsid': 3616, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1506292403, 'ssid': 1034, 'project': '', 'revision': '4912557b7fc6fcbab106157bdd8d877530adecbe'}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:33:24.037792	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 668, 'results': 0, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/668', 'builderid': 2, 'buildid': 9655, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 2, 'priority': 0, 'complete_at': None, 'buildrequestid': 12874, 'claimed_at': 1506292296, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292404, 'buildrequestid': 12874, 'builder': {'masterids': [1], 'name': 'pr-ubu-x64', 'builderid': 2, 'description': None, 'tags': []}, 'started_at': 1506292297, 'properties': {'workername': ['ubuntu', 'Worker'], 'codebase': ['', 'Build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'buildername': ['pr-ubu-x64', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [668, 'Build'], 'shortrev': ['491255', 'try build'], 'builddir': ['/var/lib/buildbot/slave/pr-ubu-x64', 'worker'], 'warnings-count': [9, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:32:25.634608	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 661, 'results': 0, 'workerid': 8, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/661', 'builderid': 34, 'buildid': 9654, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 34, 'priority': 0, 'complete_at': None, 'buildrequestid': 12882, 'claimed_at': 1506292290, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292346, 'buildrequestid': 12882, 'builder': {'masterids': [1], 'name': 'pr-freebsd-x64', 'builderid': 34, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'workername': ['freebsd', 'Worker'], 'codebase': ['', 'Build'], 'slavename': ['freebsd', 'Worker (deprecated)'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [661, 'Build'], 'shortrev': ['491255', 'try build'], 'builddir': ['/usr/home/buildbot/freebsd/pr-freebsd-x64', 'worker'], 'warnings-count': [2, 'WarningCountingShellCommand'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:37.131256	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 668, 'results': None, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/668', 'builderid': 2, 'buildid': 9655, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 2, 'priority': 0, 'complete_at': None, 'buildrequestid': 12874, 'claimed_at': 1506292296, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12874, 'builder': {'masterids': [1], 'name': 'pr-ubu-x64', 'builderid': 2, 'description': None, 'tags': []}, 'started_at': 1506292297, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-ubu-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [668, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:36.826656	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 660, 'results': 2, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/660', 'builderid': 22, 'buildid': 9651, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 22, 'priority': 0, 'complete_at': None, 'buildrequestid': 12880, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506292297, 'buildrequestid': 12880, 'builder': {'masterids': [1], 'name': 'lint', 'builderid': 22, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'buildername': ['lint', 'Builder'], 'project': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'workername': ['ubuntu', 'Worker'], 'shortrev': ['491255', 'try build'], 'builddir': ['/var/lib/buildbot/slave/lint', 'worker'], 'buildnumber': [660, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'got_revision': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'GitNoBranch'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:30.804788	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 661, 'results': None, 'workerid': 8, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/661', 'builderid': 34, 'buildid': 9654, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 34, 'priority': 0, 'complete_at': None, 'buildrequestid': 12882, 'claimed_at': 1506292290, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12882, 'builder': {'masterids': [1], 'name': 'pr-freebsd-x64', 'builderid': 34, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [661, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:30.768211	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 662, 'results': None, 'workerid': 4, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/662', 'builderid': 20, 'buildid': 9653, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 20, 'priority': 0, 'complete_at': None, 'buildrequestid': 12878, 'claimed_at': 1506292290, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12878, 'builder': {'masterids': [1], 'name': 'pr-win-x64', 'builderid': 20, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-win-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [662, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:30.651220	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 660, 'results': None, 'workerid': 9, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/660', 'builderid': 22, 'buildid': 9651, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 22, 'priority': 0, 'complete_at': None, 'buildrequestid': 12880, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12880, 'builder': {'masterids': [1], 'name': 'lint', 'builderid': 22, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['lint', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [660, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:30.646790	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 661, 'results': None, 'workerid': 12, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/661', 'builderid': 6, 'buildid': 9652, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 6, 'priority': 0, 'complete_at': None, 'buildrequestid': 12875, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12875, 'builder': {'masterids': [1], 'name': 'pr-deb-x64', 'builderid': 6, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-deb-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [661, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:31:30.613736	{'bb_type': 'starting', 'raw': {'masterid': 1, 'state_string': 'starting', 'number': 659, 'results': None, 'workerid': 1, 'url': 'https://buildbot.dolphin-emu.org/#builders/33/builds/659', 'builderid': 33, 'buildid': 9650, 'buildrequest': {'results': -1, 'submitted_at': 1506292289, 'claimed_by_masterid': 1, 'buildsetid': 3615, 'builderid': 33, 'priority': 0, 'complete_at': None, 'buildrequestid': 12881, 'claimed_at': 1506292289, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': None, 'buildrequestid': 12881, 'builder': {'masterids': [1], 'name': 'pr-osx-x64', 'builderid': 33, 'description': None, 'tags': []}, 'started_at': 1506292290, 'properties': {'codebase': ['', 'Build'], 'baserev': ['38a8d04c35b8a042981e003c866da37501475f35', 'try build'], 'buildername': ['pr-osx-x64', 'Builder'], 'project': ['', 'Build'], 'shortrev': ['491255', 'try build'], 'headrev': ['4912557b7fc6fcbab106157bdd8d877530adecbe', 'try build'], 'buildnumber': [659, 'Build'], 'pr_id': [6075, 'try build'], 'repository': ['', 'Build'], 'branchname': ['pr-6075', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'scheduler': ['pr', 'Scheduler'], 'revision': [None, 'Build'], 'branch': ['refs/pull/6075/head', 'Build']}, 'buildset': {'complete_at': None, 'reason': "'try' job by user Central (on behalf of: sepalani)", 'external_idstring': '6075-491255', 'parent_relationship': None, 'submitted_at': 1506292289, 'parent_buildid': None, 'bsid': 3615, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': 'refs/pull/6075/head', 'repository': '', 'created_at': 1505781290, 'ssid': 973, 'project': '', 'revision': None}], 'complete': False}, 'complete': False}, 'type': 'raw_bb_hook', 'source': 'webserver'}
2017-09-24T22:12:54.573667	{'bb_type': 'finished', 'raw': {'masterid': 1, 'state_string': 'finished', 'number': 183, 'results': 0, 'workerid': 6, 'url': 'https://buildbot.dolphin-emu.org/#builders/36/builds/183', 'builderid': 36, 'buildid': 9645, 'buildrequest': {'results': -1, 'submitted_at': 1506290617, 'claimed_by_masterid': 1, 'buildsetid': 3611, 'builderid': 36, 'priority': 0, 'complete_at': None, 'buildrequestid': 12870, 'claimed_at': 1506291008, 'waited_for': False, 'claimed': True, 'complete': False}, 'complete_at': 1506291174, 'buildrequestid': 12870, 'builder': {'masterids': [1], 'name': 'fifoci-ogl-lin-mesa', 'builderid': 36, 'description': None, 'tags': []}, 'started_at': 1506290617, 'properties': {'warnings-count': [6, 'WarningCountingShellCommand'], 'slavename': ['arch64', 'Worker (deprecated)'], 'buildername': ['fifoci-ogl-lin-mesa', 'Builder'], 'codebase': ['', 'Build'], 'project': ['', 'Build'], 'workername': ['arch64', 'Worker'], 'shortrev': ['5.0-5578', 'Trigger'], 'builddir': ['/home/fifoci/buildslave/fifoci-ogl-lin-mesa', 'worker'], 'author': ['Leo Lam', 'Change'], 'description': ['Merge pull request #6077 from leoetlino/dsp-fixes\n\nSmall DSP accelerator fixes', 'Change'], 'branch': [None, 'Build'], 'repository': ['', 'Build'], 'branchname': ['master', 'Change'], 'buildnumber': [183, 'Build'], 'scheduler': ['fifoci-lin', 'Scheduler'], 'got_revision': ['38a8d04c35b8a042981e003c866da37501475f35', 'GitNoBranch'], 'revision': ['38a8d04c35b8a042981e003c866da37501475f35', 'Build']}, 'buildset': {'complete_at': None, 'reason': "The Triggerable scheduler named 'fifoci-lin' triggered this build", 'external_idstring': None, 'parent_relationship': 'Triggered from', 'submitted_at': 1506290617, 'parent_buildid': 9642, 'bsid': 3611, 'results': -1, 'sourcestamps': [{'codebase': '', 'patch': None, 'branch': None, 'repository': '', 'created_at': 1506290602, 'ssid': 1033, 'project': '', 'revision': '38a8d04c35b8a042981e003c866da37501475f35'}], 'complete': False}, 'complete': True}, 'type': 'raw_bb_hook', 'source': 'webserver'}

Recent 'raw_gh_hook' events

2017-09-25T00:48:32.492217	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'edited', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'changes': {'body': {'from': 'Ditto'}}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&udp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &peer_addr.sin_port, 2);\n+  }\n+  else\n+  {\n+    std::memcpy(&udp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &sock_addr.sin_port, 2);\n+  }\n+  const u16 udp_length = static_cast<u16>(UDP_HEADER_SIZE + length);\n+  udp_header[4] = udp_length >> 8 & 0xFF;\n+  udp_header[5] = udp_length & 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:24Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777', 'position': 365, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:48:31Z', 'id': 140672777, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 365, 'body': "This can be moved closer to it's usage point.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:48:31Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:49.829907	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:26:42Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507', 'position': 216, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672507, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 216, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672507'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672507'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:49.827372	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:37:19Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866', 'position': 344, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672866, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 344, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672866'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672866'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:48.023233	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&udp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &peer_addr.sin_port, 2);\n+  }\n+  else\n+  {\n+    std::memcpy(&udp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&udp_header[2], &sock_addr.sin_port, 2);\n+  }\n+  const u16 udp_length = static_cast<u16>(UDP_HEADER_SIZE + length);\n+  udp_header[4] = udp_length >> 8 & 0xFF;\n+  udp_header[5] = udp_length & 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:24Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777', 'position': 365, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672777, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 365, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672777'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672777'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.996475	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;', 'created_at': '2017-09-25T00:33:29Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744', 'position': 280, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672744, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 280, 'body': 'These should be on their own line.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672744'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672744'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.993647	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)', 'created_at': '2017-09-25T00:36:27Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833', 'position': 202, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672833, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 202, 'body': 'Comments should go on top of non-declarative code lines where applicable.\r\n\r\n```cpp\r\nif (is_sender)\r\n{\r\n    // Source MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);\r\n}\r\nelse\r\n{\r\n    // Destination MAC address\r\n    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());\r\n}', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672833'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672833'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.990826	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;\n+  std::vector<u8> ethernet_header = GetEthernetHeader(is_sender);\n+  std::vector<u8> ip_header = GetIPHeader(is_sender, TCP_HEADER_SIZE + length, 0x06, socket);\n+  packet.insert(packet.end(), std::make_move_iterator(ethernet_header.begin()),\n+                std::make_move_iterator(ethernet_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(ip_header.begin()),\n+                std::make_move_iterator(ip_header.end()));\n+  packet.insert(packet.end(), std::make_move_iterator(tcp_header.begin()),\n+                std::make_move_iterator(tcp_header.end()));\n+  packet.insert(packet.end(), static_cast<const char*>(data),\n+                static_cast<const char*>(data) + length);\n+  m_file->AddPacket(packet.data(), packet.size());\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t UDP_HEADER_SIZE = 8;\n+  std::vector<u8> udp_header(UDP_HEADER_SIZE, 0);', 'created_at': '2017-09-25T00:27:52Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547', 'position': 341, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672547, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 341, 'body': 'Ditto', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672547'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672547'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.987859	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -22,9 +22,14 @@\n class PCAP final\n {\n public:\n+  static constexpr u32 PCAP_DATA_LINK_TYPE = 147;  // Reserved for internal use.', 'created_at': '2017-09-25T00:43:55Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138', 'position': 4, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140673138, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 4, 'body': 'You may want to place this into an enum class, along with the magic number used [here](#diff-2394256c451ee31017bb735ff6f6f762R94) to represent ethernet.\r\n\r\n', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140673138'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140673138'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Common/PcapFile.h'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.985201	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};\n+\n+  // Get Dolphin MAC address\n+  const std::string mac_address = SConfig::GetInstance().m_WirelessMac;\n+  if (!Common::StringToMacAddress(mac_address, mac))\n+    std::memset(mac, 0, Common::MAC_ADDRESS_SIZE);\n+\n+  // Write Dolphin MAC address, the other one is dummy\n+  if (is_sender)\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin() + 6);  // Source MAC address\n+  else\n+    std::copy(std::begin(mac), std::end(mac), ethernet_header.begin());  // Destination MAC address\n+\n+  // Write the proctol type (IP = 08 00)\n+  ethernet_header[12] = 8;\n+  return ethernet_header;\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetIPHeader(bool is_sender, std::size_t data_size,\n+                                                  u8 protocol, s32 socket)\n+{\n+  constexpr std::size_t IP_HEADER_SIZE = 20;\n+  std::vector<u8> ip_header(IP_HEADER_SIZE, 0);\n+  const std::size_t total_length = IP_HEADER_SIZE + data_size;\n+\n+  // Write IP version and header length\n+  ip_header[0] = 0x45;\n+  // Write total length\n+  ip_header[2] = total_length >> 8 & 0xFF;\n+  ip_header[3] = total_length & 0xFF;\n+  // Write flags + fragment offset\n+  ip_header[6] = 0x40;\n+  // Write TTL\n+  ip_header[8] = 0x40;\n+  // Write protocol\n+  ip_header[9] = protocol;\n+\n+  // Get socket IP address\n+  struct sockaddr_in addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&addr), &addr_len);\n+\n+  if (is_sender)\n+  {\n+    // Write Source IP address: 127.0.0.1\n+    ip_header[12] = 0x7F;\n+    ip_header[15] = 0x01;\n+    // Write Destination IP address\n+    std::memcpy(&ip_header[16], &addr.sin_addr, 4);\n+  }\n+  else\n+  {\n+    // Write Source IP address\n+    std::memcpy(&ip_header[12], &addr.sin_addr, 4);\n+    // Write Destination IP address: 127.0.0.1\n+    ip_header[16] = 0x7F;\n+    ip_header[19] = 0x01;\n+  }\n+\n+  // Compute checksum\n+  std::size_t index = 0;\n+  u32 checksum = 0;\n+  u16 word = 0;\n+  for (u8 b : ip_header)\n+  {\n+    if (index % 2 == 0)\n+      word = b;\n+    else\n+      checksum += (word << 8) + b;\n+    index += 1;\n+  }\n+  checksum = (checksum + (checksum >> 16) & 0xFFFF) ^ 0xFFFF;\n+\n+  // Write checksum\n+  ip_header[10] = checksum >> 8 & 0xFF;\n+  ip_header[11] = checksum & 0xFF;\n+\n+  return ip_header;\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCP(bool is_sender, const void* data, std::size_t length, s32 socket)\n+{\n+  constexpr std::size_t TCP_HEADER_SIZE = 20;\n+  std::vector<u8> tcp_header(TCP_HEADER_SIZE, 0);\n+\n+  // Get socket port\n+  struct sockaddr_in sock_addr, peer_addr;\n+  socklen_t addr_len = sizeof(struct sockaddr_in);\n+  getsockname(socket, reinterpret_cast<struct sockaddr*>(&sock_addr), &addr_len);\n+  getpeername(socket, reinterpret_cast<struct sockaddr*>(&peer_addr), &addr_len);\n+\n+  // Write port\n+  if (is_sender)\n+  {\n+    std::memcpy(&tcp_header[0], &sock_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &peer_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+  else\n+  {\n+    std::memcpy(&tcp_header[0], &peer_addr.sin_port, 2);\n+    std::memcpy(&tcp_header[2], &sock_addr.sin_port, 2);\n+\n+    // Write sequence number\n+    static u32 sequence_number = 0;\n+    tcp_header[4] = sequence_number >> 24 & 0xFF;\n+    tcp_header[5] = sequence_number >> 16 & 0xFF;\n+    tcp_header[6] = sequence_number >> 8 & 0xFF;\n+    tcp_header[7] = sequence_number & 0xFF;\n+    sequence_number += static_cast<u32>(length);\n+  }\n+\n+  // Write data offset\n+  tcp_header[12] = 0x50;\n+\n+  // Write flags\n+  // TODO\n+\n+  // Write window size\n+  tcp_header[14] = 0xFF;\n+  tcp_header[15] = 0xFF;\n+\n+  // Add the packet\n+  std::vector<u8> packet;', 'created_at': '2017-09-25T00:34:14Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774', 'position': 324, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672774, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 324, 'body': "This can be moved closer to it's usage point.", 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672774'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672774'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'number': 6075, 'assignee': None, 'updated_at': '2017-09-25T00:47:45Z', 'state': 'open', 'head': {'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'ref': 'pcap-log', 'sha': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'label': 'sepalani:pcap-log', 'repo': {'compare_url': 'https://api.github.com/repos/sepalani/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/sepalani/dolphin/releases{/id}', 'created_at': '2015-05-31T10:13:24Z', 'labels_url': 'https://api.github.com/repos/sepalani/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/sepalani/dolphin/statuses/{sha}', 'git_url': 'git://github.com/sepalani/dolphin.git', 'html_url': 'https://github.com/sepalani/dolphin', 'subscribers_url': 'https://api.github.com/repos/sepalani/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/sepalani/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 0, 'svn_url': 'https://github.com/sepalani/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'sepalani/dolphin', 'branches_url': 'https://api.github.com/repos/sepalani/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/sepalani/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/sepalani/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:sepalani/dolphin.git', 'pulls_url': 'https://api.github.com/repos/sepalani/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/sepalani/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/sepalani/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:20Z', 'assignees_url': 'https://api.github.com/repos/sepalani/dolphin/assignees{/user}', 'updated_at': '2016-02-05T22:39:47Z', 'fork': True, 'tags_url': 'https://api.github.com/repos/sepalani/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/sepalani/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 0, 'private': False, 'forks_count': 0, 'git_refs_url': 'https://api.github.com/repos/sepalani/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/sepalani/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/sepalani/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/sepalani/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/sepalani/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/sepalani/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/sepalani/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/sepalani/dolphin/teams', 'has_projects': True, 'issues_url': 'https://api.github.com/repos/sepalani/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/sepalani/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/sepalani/subscriptions', 'starred_url': 'https://api.github.com/users/sepalani/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/sepalani/following{/other_user}', 'login': 'sepalani', 'received_events_url': 'https://api.github.com/users/sepalani/received_events', 'followers_url': 'https://api.github.com/users/sepalani/followers', 'organizations_url': 'https://api.github.com/users/sepalani/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/sepalani/dolphin', 'languages_url': 'https://api.github.com/repos/sepalani/dolphin/languages', 'id': 36597702, 'merges_url': 'https://api.github.com/repos/sepalani/dolphin/merges', 'clone_url': 'https://github.com/sepalani/dolphin.git', 'comments_url': 'https://api.github.com/repos/sepalani/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/sepalani/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/sepalani/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/sepalani/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/sepalani/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 310541, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/sepalani/dolphin/git/trees{/sha}', 'open_issues': 0, 'stargazers_count': 0, 'milestones_url': 'https://api.github.com/repos/sepalani/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/sepalani/dolphin/notifications{?since,all,participating}', 'watchers': 0, 'forks': 0, 'issue_events_url': 'https://api.github.com/repos/sepalani/dolphin/issues/events{/number}', 'has_issues': False}}, 'author_association': 'CONTRIBUTOR', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.diff', '_links': {'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/commits', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/6075.patch', 'title': '[WIP] PCAP logging with fake TCP/UDP packet'}}, 'type': 'raw_gh_hook', 'source': 'webserver'}
2017-09-25T00:47:47.982311	{'gh_type': 'pull_request_review_comment', 'raw': {'action': 'created', 'sender': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'repository': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}, 'comment': {'commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'diff_hunk': '@@ -0,0 +1,378 @@\n+// Copyright 2017 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "Core/NetworkCaptureLogger.h"\n+\n+#ifdef _WIN32\n+#include <WinSock2.h>\n+using socklen_t = int;\n+#else\n+#include <netinet/in.h>\n+#include <sys/socket.h>\n+#include <sys/types.h>\n+#endif\n+\n+#include <cerrno>\n+#include <chrono>\n+#include <cstring>\n+#include <ctime>\n+#include <iterator>\n+\n+#include "Common/File.h"\n+#include "Common/FileUtil.h"\n+#include "Common/Network.h"\n+#include "Core/ConfigManager.h"\n+\n+namespace Core\n+{\n+NetworkCaptureLogger::~NetworkCaptureLogger() = default;\n+\n+void DummyNetworkCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+void DummyNetworkCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+}\n+\n+BinarySSLCaptureLogger::BinarySSLCaptureLogger()\n+{\n+  if (SConfig::GetInstance().m_SSLDumpRead)\n+  {\n+    m_file_read.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_read.bin", "ab");\n+  }\n+  if (SConfig::GetInstance().m_SSLDumpWrite)\n+  {\n+    m_file_write.Open(\n+        File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + "_write.bin", "ab");\n+  }\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_read.WriteBytes(data, length);\n+}\n+\n+void BinarySSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  m_file_write.WriteBytes(data, length);\n+}\n+\n+PCAPSSLCaptureLogger::PCAPSSLCaptureLogger()\n+{\n+  std::time_t t = std::time(nullptr);\n+  char buffer[32] = "";\n+  std::strftime(buffer, sizeof(buffer), " %Y-%m-%d %Hh%Mm%Ss.pcap", std::localtime(&t));\n+  const std::string filename =\n+      File::GetUserPath(D_DUMPSSL_IDX) + SConfig::GetInstance().GetGameID() + buffer;\n+  m_file = std::make_unique<PCAP>(new File::IOFile(filename, "wb"), 1);\n+}\n+\n+PCAPSSLCaptureLogger::ErrorState PCAPSSLCaptureLogger::SaveState() const\n+{\n+  return {\n+      errno,\n+#ifdef _WIN32\n+      WSAGetLastError(),\n+#endif\n+  };\n+}\n+\n+void PCAPSSLCaptureLogger::RestoreState(const PCAPSSLCaptureLogger::ErrorState& state) const\n+{\n+  errno = state.error;\n+#ifdef _WIN32\n+  WSASetLastError(state.wsa_error);\n+#endif\n+}\n+\n+void PCAPSSLCaptureLogger::Log(LogType log_type, bool is_sender, const void* data,\n+                               std::size_t length, s32 socket)\n+{\n+  const auto state = SaveState();\n+  if (log_type == LogType::UDP)\n+    LogUDP(is_sender, data, length, socket);\n+  else\n+    LogTCP(is_sender, data, length, socket);\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogSSLWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::SSL, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogTCPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::TCP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPRead(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, false, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogUDPWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  Log(LogType::UDP, true, data, length, socket);\n+}\n+\n+void PCAPSSLCaptureLogger::LogRead(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPRead(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPRead(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+void PCAPSSLCaptureLogger::LogWrite(const void* data, std::size_t length, s32 socket)\n+{\n+  int socket_type;\n+  socklen_t option_length = sizeof(int);\n+\n+  const auto state = SaveState();\n+  if (getsockopt(socket, SOL_SOCKET, SO_TYPE, reinterpret_cast<char*>(&socket_type),\n+                 &option_length) == 0)\n+  {\n+    if (socket_type == SOCK_STREAM)\n+      LogTCPWrite(data, length, socket);\n+    else if (socket_type == SOCK_DGRAM)\n+      LogUDPWrite(data, length, socket);\n+  }\n+  RestoreState(state);\n+}\n+\n+std::vector<u8> PCAPSSLCaptureLogger::GetEthernetHeader(bool is_sender)\n+{\n+  constexpr std::size_t ETHERNET_HEADER_SIZE = 14;\n+  std::vector<u8> ethernet_header(ETHERNET_HEADER_SIZE, 0);\n+  u8 mac[Common::MAC_ADDRESS_SIZE] = {};', 'created_at': '2017-09-25T00:31:12Z', 'user': {'gists_url': 'https://api.github.com/users/lioncash/gists{/gist_id}', 'avatar_url': 'https://avatars1.githubusercontent.com/u/712067?v=4', 'url': 'https://api.github.com/users/lioncash', 'gravatar_id': '', 'html_url': 'https://github.com/lioncash', 'id': 712067, 'repos_url': 'https://api.github.com/users/lioncash/repos', 'events_url': 'https://api.github.com/users/lioncash/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/lioncash/subscriptions', 'starred_url': 'https://api.github.com/users/lioncash/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/lioncash/following{/other_user}', 'login': 'lioncash', 'received_events_url': 'https://api.github.com/users/lioncash/received_events', 'followers_url': 'https://api.github.com/users/lioncash/followers', 'organizations_url': 'https://api.github.com/users/lioncash/orgs', 'type': 'User'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648', 'position': 194, 'pull_request_review_id': 64777734, 'updated_at': '2017-09-25T00:47:45Z', 'id': 140672648, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'author_association': 'OWNER', 'original_position': 194, 'body': '`std::array`. This also allows replacing the memset below with either a `.fill(0)` or `mac = {};`.', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648', '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/6075#discussion_r140672648'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/140672648'}, 'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075'}}, 'original_commit_id': '4912557b7fc6fcbab106157bdd8d877530adecbe', 'path': 'Source/Core/Core/NetworkCaptureLogger.cpp'}, 'organization': {'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'url': 'https://api.github.com/orgs/dolphin-emu', 'login': 'dolphin-emu', 'description': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'id': 5050316, 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}'}, 'pull_request': {'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075/comments', 'locked': False, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'merge_commit_sha': 'e9923bcd95aced1f1a47c733cf59495f8558c79c', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/6075', 'requested_reviewers': [], 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/6075', 'id': 141734166, 'milestone': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075/comments', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/6075', 'assignees': [], 'created_at': '2017-09-19T00:34:42Z', 'body': "This is more an experimental PR than anything else. It's faking Ethernet/IP headers using Dolphin's MAC and a dummy one. However, it lacks several things such as\r\n- Proper TCP packets with flags, sequence number, etc.\r\n- Dolphin's IP is hardcoded, FTM.\r\n- It's still WIP as I haven't tested many cases.\r\n\r\nWhat it does:\r\n- Log SSL traffic\r\n- Log TCP traffic\r\n- Log UDP traffic\r\n- Create a PCAP file (filename with gamename+timestamp) in Dump/SSL\r\n\r\nRegardless, I tested it with few games and it seems to produce a valid PCAP file while logging TCP, UDP and SSL traffic. It's replacing the previous logging, I should probably add a config option to switch the logging format (binary, pcap) or ditch the binary format later on if I decide this PR is worth it.\r\n\r\nI'm quite skeptical regarding this method and really think a custom format (or another one) should probably be used instead within the PCAP file.\r\n\r\nAnyway, ready to be reviewed. Depends on https://github.com/dolphin-emu/dolphin/pull/5978.", 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/4912557b7fc6fcbab106157bdd8d877530adecbe', 'base': {'user': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'ref': 'master', 'sha': '38a8d04c35b8a042981e003c866da37501475f35', 'label': 'dolphin-emu:master', 'repo': {'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'created_at': '2013-07-22T09:07:57Z', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'html_url': 'https://github.com/dolphin-emu/dolphin', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'has_wiki': True, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'homepage': 'https://dolphin-emu.org/', 'watchers_count': 3696, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'full_name': 'dolphin-emu/dolphin', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'name': 'dolphin', 'pushed_at': '2017-09-24T22:31:22Z', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'updated_at': '2017-09-24T21:28:48Z', 'fork': False, 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'has_downloads': True, 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'default_branch': 'master', 'open_issues_count': 133, 'private': False, 'forks_count': 929, 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'has_projects': False, 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'owner': {'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'url': 'https://api.github.com/users/dolphin-emu', 'gravatar_id': '', 'html_url': 'https://github.com/dolphin-emu', 'id': 5050316, 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'site_admin': False, 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'login': 'dolphin-emu', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'type': 'Organization'}, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'id': 11577304, 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'language': 'C++', 'has_pages': False, 'size': 348896, 'mirror_url': None, 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'open_issues': 133, 'stargazers_count': 3696, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'watchers': 3696, 'forks': 929, 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'has_issues': False}}, 'merged_at': None, 'closed_at': None, 'user': {'gists_url': 'https://api.github.com/users/sepalani/gists{/gist_id}', 'avatar_url': 'https://avatars0.githubusercontent.com/u/7890055?v=4', 'url': 'https://api.github.com/users/sepalani', 'gravatar_id': '', 'html_url': 'https://github.com/sepalani', 'id': 7890055, 'repos_url': 'https://api.github.com/users/sepalani/repos', 'events_url': 'https://api.github.com/users/sepalani/events{/privacy}', 'site_admin':