{"action":"created","comment":{"url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/comments/82928718","pull_request_review_id":3801298,"id":82928718,"diff_hunk":"@@ -375,133 +414,206 @@ void XMLimport::readAreas()\n         }\n         if( name() == \"area\" )\n         {\n-            readAreaNames();\n+            readArea();\n         }\n \n     }\n }\n \n-void XMLimport::readAreaNames()\n+void XMLimport::readArea()\n {\n     int id = attributes().value(\"id\").toString().toInt();\n     QString name = attributes().value(\"name\").toString();\n     mpHost->mpMap->mpRoomDB->addArea( id, name );\n }\n \n-void XMLimport::readRooms()\n+void XMLimport::readRooms( QMultiHash<int, int> & areaRoomsHash, QMultiHash<int, int> & roomEntrancesHash )\n {\n+\n     while( ! atEnd() )\n     {\n         readNext();\n-        if( isEndElement() )\n-        {\n-            break;\n-        }\n \n-        if( isStartElement() )\n+        if( Q_LIKELY( isStartElement() ) )\n         {\n-            if( name() == \"room\" )\n+            if( Q_LIKELY( name() == QStringLiteral( \"room\" ) ) )\n             {\n-                readRoom();\n+                readRoom( areaRoomsHash, roomEntrancesHash );\n             }\n-\n             else\n             {\n                 readUnknownMapElement();\n             }\n         }\n+        else if( isEndElement() )\n+        {\n+            break;\n+        }\n     }\n }\n \n-\n-void XMLimport::readRoom()\n+// This is a CPU/Time hog...\n+void XMLimport::readRoom( QMultiHash<int, int> & areamRoomMultiHash, QMultiHash<int, int> & entranceMultiHash )\n {\n     TRoom * pT = new TRoom( mpHost->mpMap->mpRoomDB );\n-    pT->id = attributes().value(\"id\").toString().toInt();\n-    pT->area = attributes().value(\"area\").toString().toInt();\n-    pT->name = attributes().value(\"title\").toString();\n-    pT->environment = attributes().value(\"environment\").toString().toInt();\n+    pT->id = attributes().value( QStringLiteral( \"id\" ) ).toString().toInt();\n+    pT->area = attributes().value( QStringLiteral( \"area\" ) ).toString().toInt();\n+    pT->name = attributes().value( QStringLiteral( \"title\" ) ).toString();\n+    pT->environment = attributes().value( QStringLiteral( \"environment\" ) ).toString().toInt();\n \n     while( ! atEnd() )\n     {\n         readNext();\n \n-        if( name() == \"\" ) continue;\n-        if( name() == \"coord\" )\n+        if( Q_UNLIKELY( pT->id < 1 ) )\n         {\n-            if( attributes().value(\"x\").toString() == \"\" ) continue;\n-            pT->x = attributes().value(\"x\").toString().toInt();\n-            pT->y = attributes().value(\"y\").toString().toInt();\n-            pT->z = attributes().value(\"z\").toString().toInt();\n-            continue;\n+            continue; // Skip further tests on exits as we'd have to throw away\n+                      // this invalid room and it would mess up the entranceMultiHash\n         }\n-        else if( name() == \"exit\")\n+        else if( Q_LIKELY( name() == QStringLiteral( \"exit\" ) ) )\n         {\n-            QString dir = attributes().value(\"direction\").toString();\n-            int e = attributes().value(\"target\").toString().toInt();\n-            if( dir == \"\" ) continue;\n-            if( dir == \"north\" )\n+            QString dir = attributes().value( QStringLiteral( \"direction\" ) ).toString();\n+            int e = attributes().value( QStringLiteral( \"target\" ) ).toString().toInt();\n+            if( dir.isEmpty() )\n+            {\n+                continue;\n+            }\n+            else if( dir == QStringLiteral( \"north\" ) )\n             {\n                 pT->north = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"south\" )\n+            else if( dir == QStringLiteral( \"east\" ) )\n             {\n-                pT->south = e;\n+                pT->east = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"northwest\" )\n+            else if( dir == QStringLiteral( \"south\" ) )\n             {\n-                pT->northwest = e;\n+                pT->south = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"southwest\" )\n+            else if( dir == QStringLiteral( \"west\" ) )\n             {\n-                pT->southwest = e;\n+                pT->west = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"northeast\" )\n+            else if( dir == QStringLiteral( \"up\" ) )\n             {\n-                pT->northeast = e;\n+                pT->up = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"southeast\" )\n+            else if( dir == QStringLiteral( \"down\" ) )\n             {\n-                pT->southeast = e;\n+                pT->down = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"west\" )\n+            else if( dir == QStringLiteral( \"northeast\" ) )\n             {\n-                pT->west = e;\n+                pT->northeast = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"east\" )\n+            else if( dir == QStringLiteral( \"southwest\" ) )\n             {\n-                pT->east = e;\n+                pT->southwest = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"up\" )\n+            else if( dir == QStringLiteral( \"southeast\" ) )\n             {\n-                pT->up = e;\n+                pT->southeast = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"down\" )\n+            else if( dir == QStringLiteral( \"northwest\" ) )\n             {\n-                pT->down = e;\n+                pT->northwest = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"in\" )\n+            else if( dir == QStringLiteral( \"in\" ) )\n             {\n                 pT->in = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n             }\n-            if( dir == \"out\" )\n+            else if( dir == QStringLiteral( \"out\" ) )\n             {\n                 pT->out = e;\n+                if( ! entranceMultiHash.contains( e, pT->id ) )\n+                {\n+                    entranceMultiHash.insert( e, pT->id );\n+                }\n+            }\n+            else\n+            {\n+                // TODO: Handle Special Exits\n             }\n             continue;\n         }\n+        else if( name() == QStringLiteral( \"coord\" ) )\n+        {\n+            if( attributes().value(\"x\").toString().isEmpty() )\n+            {\n+                continue;\n+            }\n+\n+            pT->x = attributes().value( QStringLiteral( \"x\" ) ).toString().toInt();\n+            pT->y = attributes().value( QStringLiteral( \"y\" ) ).toString().toInt();\n+            pT->z = attributes().value( QStringLiteral( \"z\" ) ).toString().toInt();\n+            continue;\n+        }\n+        else if( Q_UNLIKELY( name().isEmpty() ) )\n+        {\n+            continue;\n+        }\n+\n         if( isEndElement() )\n         {\n             break;\n         }\n     }\n-    if( pT->id != 0 )\n+\n+    if( pT->id > 0 )\n     {\n+        mpHost->mpMap->reportStringToProgressDialog( tr( \"Parsing Room data [id: %1]...\" ).arg( pT->id ) );\n+        areamRoomMultiHash.insert( pT->area, pT->id );\n         mpHost->mpMap->mpRoomDB->addRoom( pT->id, pT );","path":"src/XMLimport.cpp","position":356,"original_position":356,"commit_id":"e50504cabd110cfb39f7b2d8f817d79a7ef91155","original_commit_id":"1c42e36a99f0532e3a4e88c1b7235a864de197d8","user":{"login":"vadi2","id":110988,"avatar_url":"https://avatars.githubusercontent.com/u/110988?v=3","gravatar_id":"","url":"https://api.github.com/users/vadi2","html_url":"https://github.com/vadi2","followers_url":"https://api.github.com/users/vadi2/followers","following_url":"https://api.github.com/users/vadi2/following{/other_user}","gists_url":"https://api.github.com/users/vadi2/gists{/gist_id}","starred_url":"https://api.github.com/users/vadi2/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/vadi2/subscriptions","organizations_url":"https://api.github.com/users/vadi2/orgs","repos_url":"https://api.github.com/users/vadi2/repos","events_url":"https://api.github.com/users/vadi2/events{/privacy}","received_events_url":"https://api.github.com/users/vadi2/received_events","type":"User","site_admin":false},"body":":+1: glad you've found this!","created_at":"2016-10-12T02:53:48Z","updated_at":"2016-10-12T02:53:49Z","html_url":"https://github.com/Mudlet/Mudlet/pull/326#discussion_r82928718","pull_request_url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326","_links":{"self":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/comments/82928718"},"html":{"href":"https://github.com/Mudlet/Mudlet/pull/326#discussion_r82928718"},"pull_request":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326"}}},"pull_request":{"url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326","id":88382867,"html_url":"https://github.com/Mudlet/Mudlet/pull/326","diff_url":"https://github.com/Mudlet/Mudlet/pull/326.diff","patch_url":"https://github.com/Mudlet/Mudlet/pull/326.patch","issue_url":"https://api.github.com/repos/Mudlet/Mudlet/issues/326","number":326,"state":"open","locked":false,"title":"Enhance: fix map downloading code, add manual XML map importing","user":{"login":"SlySven","id":6163092,"avatar_url":"https://avatars.githubusercontent.com/u/6163092?v=3","gravatar_id":"","url":"https://api.github.com/users/SlySven","html_url":"https://github.com/SlySven","followers_url":"https://api.github.com/users/SlySven/followers","following_url":"https://api.github.com/users/SlySven/following{/other_user}","gists_url":"https://api.github.com/users/SlySven/gists{/gist_id}","starred_url":"https://api.github.com/users/SlySven/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SlySven/subscriptions","organizations_url":"https://api.github.com/users/SlySven/orgs","repos_url":"https://api.github.com/users/SlySven/repos","events_url":"https://api.github.com/users/SlySven/events{/privacy}","received_events_url":"https://api.github.com/users/SlySven/received_events","type":"User","site_admin":false},"body":"A recent move by I.R.E. to using SSL for their public MUD map URLs broke the ability for Mudlet to download those XML format files.  This commit addresses this issue (as mentioned in, but not the original problem referred to in https://bugs.launchpad.net/mudlet/+bug/1427364) the revision to the code does now use \"https://www.<MUD URL>/maps/map.xml\" as a default name for the I.R.E. MUDS - however the method that initiates the download which was moved to `TMap` class from the `dlgMapper` one (see below) is now:\r\n`(bool) TMap::downloadMap( const QString * remoteUrl = Q_NULLPTR, const QString * localFileName = Q_NULLPTR )`\r\nwhich if not supplied with any arguments behaves as before.  However the remoteUrl argument may be given as a full `QString` including the scheme (the bit of the URL at the beginning before the ':') to override that and a second argument may be used to provide a different name to use for the local file name which if is a RELATIVE pathFileName will be resolved in relation to the profile directory.  At present no use is made of this additional functionality but it may be useful for use with other MUDs if they should choose to provide XML map files with other remote locations and scripts using a different local filename.\r\n\r\nAs a long-standing thing that needed doing I have finally provided a means to import a map XML file that - for instance - has already been download. It had been noted that there was no way to read those I.R.E. map files even if they had been obtained from a web browser able to correctly handle https: URLs - now both `TLuaInterpreter::loadMap()` and the\r\n`dlgProfilePreference` \"loadMap\" button {NOT the IRE only \"map download\" one} will both handle files ending in \".xml\" (not case sensitive so it'll work MacOS platforms as well!}  For the loadMap case it will be necessary to change the filetype filter on the File Selection dialog to select \"xml\" files.\r\n\r\nDuring testing it became clear to me that it was possible to try and read one or more XML files via several mechanisms simultaneously with \"unhelpful\" consequences.  As well as hitting the `dlgProfilePreferences` IRE \"map download\" multiple times, `TLuaInterpreter::loadMap()` does NOT block until the map has been loaded and as the import time {running of `XMLinport::readPackage(...)`} is of significant duration for a large map (a debug, without optimisation, build on my 1.8GHz Quad-core took over two\r\nminutes to process the current Achaea map file) it is very possible to get conditions where the same profile will try to run `XMLinport::readPackage(...)` asynchronously - given that a profile only supports ONE map at a time it was necessary to fit a `QMutex` to prevent\r\nthe part of the `XMLinport` class relating to XML Map files being called from different places in the map related code.  This means that if a map download is started further downloads and any local map imports will fail until that first download has completed or aborted.  \r\nSimilarly a local import will prevent a download being started.  As a side effect this cures:\r\nhttps://bugs.launchpad.net/mudlet/+bug/852861 - \"Map download button starts\r\nanother download thread if one is already going\"\r\n\r\nThe previous XML import code was not adding the rooms that it parsed to the relevant `TArea::rooms` member - although this would be picked-up and fixed by `TMap::audit()` later on, this would be accompanied by an error message about every single room.  The code now builds up this information while parsing the rooms' details and inserts it so that this does not cause report-able problems during the `TMap::audit()` execution - the data gathered also allows missing areas to be spotted so that if a room claimed to belong to an area that was not included in the preceding areas' data an unnamed area is created for it.\r\n\r\nAs a consequence of the long time to actually parse an XML map file I have enhanced the progress dialog that was originally used to track the map file download.  It is now retained until the file is completely imported and shows more information about the process - importantly it shows during the `XMLimport::readRoom(...)` the room id being processed - and THAT method is the time/cpu hog so seeing something happening during the time that Mudlet otherwise appears to hang is useful feedback even if it adds a few seconds to the overall duration (may be more than a minute).  This dialog is now also used during the other routes that involve reading an XML file and there is now a bit of consistency with the on-screen messages. \r\n\r\nWhilst inspecting the `XMLimport` class I found there was some uncertain initialisation which I have tidied up. \r\n\r\nIn summary:\r\nAdded:\r\n* `(bool) TConsole::importMap(const QString & location)`\r\n* `(void) TRoomDB::setAreaRooms(const int areaId, const QSet<int> & roomIds)`\r\n* image file mudlet_map_download.png used as icon for download/import progress dialog\r\n* `(bool) TMap::importMap(QFile & file)`\r\n* `(bool) TMap::readXmlMapFile(QFile & file)`\r\n* `(void) TMap::slot_downloadError(QNetworkReply::NetworkError error)`\r\n* `(void) TMap::reportStringToProgressDialog(const QString text)`\r\n* `(void) TMap::reportProgressToProgressDialog(const int current, const int maximum)`\r\n\r\nRevised:\r\n* `(int)TLuaInterpreter::loadMap( lua_State * )`\r\n* Moved XML map download code from `dlgMapper` class to the `TMap` one:\r\n + `(void) dlgMapper::downloadMap()` ==> `(bool) TMap::downloadMap(const QString * remoteUrl, const QString * localFileName)`\r\n + `(void) dlgMapper::setDownloadProgress(qint64, qint64)` ==> `(void) TMap::slot_setDownloadProgress(qint64,qint64)`\r\n + `(void) dlgMapper::cancel()` ==> `(void) TMap::slot_downloadCancel()`\r\n + `(void) dlgMapper::replyFinished(QNetworkReply *)` ==> `(void) TMap::slot_replyFinished(QNetworkReply *)`\r\n\r\n* Enhanced download progress indication to also include parsing which can take even more time than the download!\r\n\r\n* Provide means to import local XML map file\r\n\r\n* Prevent trying to import/download more than one map at a time\r\n\r\nRenamed:\r\n* `(void) XMLimport::readAreaNames()` ==> `XMLimport::readArea()` - for consistency with related functions\r\n\r\nCommented out unused:\r\n* `(void) XMLimport::readUnknownRoomElement()`\r\n\r\nNote the movement of the map file download code to the `TMap` class does require making the latter a class with the `Q_OBJECT` macro (which removes the need for `Q_DECLARE_TR_FUNCTIONS` as a side-effect!) - though as another side-effect the `TMap` header needed a `boost` name specifier added to one identifier as that identifier (`property`) exists in both boost and QObject classes!!! __YOU MAY NEED TO RUN QMAKE ON THE PROJECT IF THE BUILD SYSTEM DOES NOT PICK UP THE ADDITION OF \"Q_OBJECT\" TO THE `TMap` CLASS.__\r\n\r\nSigned-off-by: Stephen Lyons <slysven@virginmedia.com>","created_at":"2016-10-07T05:27:44Z","updated_at":"2016-10-12T02:53:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2965767444419efbacd84ba983490c4a555a1e6f","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326/commits","review_comments_url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326/comments","review_comment_url":"https://api.github.com/repos/Mudlet/Mudlet/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Mudlet/Mudlet/issues/326/comments","statuses_url":"https://api.github.com/repos/Mudlet/Mudlet/statuses/e50504cabd110cfb39f7b2d8f817d79a7ef91155","head":{"label":"SlySven:enhance_basicXmlMapImport","ref":"enhance_basicXmlMapImport","sha":"e50504cabd110cfb39f7b2d8f817d79a7ef91155","user":{"login":"SlySven","id":6163092,"avatar_url":"https://avatars.githubusercontent.com/u/6163092?v=3","gravatar_id":"","url":"https://api.github.com/users/SlySven","html_url":"https://github.com/SlySven","followers_url":"https://api.github.com/users/SlySven/followers","following_url":"https://api.github.com/users/SlySven/following{/other_user}","gists_url":"https://api.github.com/users/SlySven/gists{/gist_id}","starred_url":"https://api.github.com/users/SlySven/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SlySven/subscriptions","organizations_url":"https://api.github.com/users/SlySven/orgs","repos_url":"https://api.github.com/users/SlySven/repos","events_url":"https://api.github.com/users/SlySven/events{/privacy}","received_events_url":"https://api.github.com/users/SlySven/received_events","type":"User","site_admin":false},"repo":{"id":22490921,"name":"Mudlet","full_name":"SlySven/Mudlet","owner":{"login":"SlySven","id":6163092,"avatar_url":"https://avatars.githubusercontent.com/u/6163092?v=3","gravatar_id":"","url":"https://api.github.com/users/SlySven","html_url":"https://github.com/SlySven","followers_url":"https://api.github.com/users/SlySven/followers","following_url":"https://api.github.com/users/SlySven/following{/other_user}","gists_url":"https://api.github.com/users/SlySven/gists{/gist_id}","starred_url":"https://api.github.com/users/SlySven/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/SlySven/subscriptions","organizations_url":"https://api.github.com/users/SlySven/orgs","repos_url":"https://api.github.com/users/SlySven/repos","events_url":"https://api.github.com/users/SlySven/events{/privacy}","received_events_url":"https://api.github.com/users/SlySven/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/SlySven/Mudlet","description":"A modern open source MUD client with a graphical user inteface and full built in Lua scripting support for all major platforms.","fork":true,"url":"https://api.github.com/repos/SlySven/Mudlet","forks_url":"https://api.github.com/repos/SlySven/Mudlet/forks","keys_url":"https://api.github.com/repos/SlySven/Mudlet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/SlySven/Mudlet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/SlySven/Mudlet/teams","hooks_url":"https://api.github.com/repos/SlySven/Mudlet/hooks","issue_events_url":"https://api.github.com/repos/SlySven/Mudlet/issues/events{/number}","events_url":"https://api.github.com/repos/SlySven/Mudlet/events","assignees_url":"https://api.github.com/repos/SlySven/Mudlet/assignees{/user}","branches_url":"https://api.github.com/repos/SlySven/Mudlet/branches{/branch}","tags_url":"https://api.github.com/repos/SlySven/Mudlet/tags","blobs_url":"https://api.github.com/repos/SlySven/Mudlet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/SlySven/Mudlet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/SlySven/Mudlet/git/refs{/sha}","trees_url":"https://api.github.com/repos/SlySven/Mudlet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/SlySven/Mudlet/statuses/{sha}","languages_url":"https://api.github.com/repos/SlySven/Mudlet/languages","stargazers_url":"https://api.github.com/repos/SlySven/Mudlet/stargazers","contributors_url":"https://api.github.com/repos/SlySven/Mudlet/contributors","subscribers_url":"https://api.github.com/repos/SlySven/Mudlet/subscribers","subscription_url":"https://api.github.com/repos/SlySven/Mudlet/subscription","commits_url":"https://api.github.com/repos/SlySven/Mudlet/commits{/sha}","git_commits_url":"https://api.github.com/repos/SlySven/Mudlet/git/commits{/sha}","comments_url":"https://api.github.com/repos/SlySven/Mudlet/comments{/number}","issue_comment_url":"https://api.github.com/repos/SlySven/Mudlet/issues/comments{/number}","contents_url":"https://api.github.com/repos/SlySven/Mudlet/contents/{+path}","compare_url":"https://api.github.com/repos/SlySven/Mudlet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/SlySven/Mudlet/merges","archive_url":"https://api.github.com/repos/SlySven/Mudlet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/SlySven/Mudlet/downloads","issues_url":"https://api.github.com/repos/SlySven/Mudlet/issues{/number}","pulls_url":"https://api.github.com/repos/SlySven/Mudlet/pulls{/number}","milestones_url":"https://api.github.com/repos/SlySven/Mudlet/milestones{/number}","notifications_url":"https://api.github.com/repos/SlySven/Mudlet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/SlySven/Mudlet/labels{/name}","releases_url":"https://api.github.com/repos/SlySven/Mudlet/releases{/id}","deployments_url":"https://api.github.com/repos/SlySven/Mudlet/deployments","created_at":"2014-08-01T01:05:26Z","updated_at":"2016-02-03T16:22:21Z","pushed_at":"2016-10-10T16:59:36Z","git_url":"git://github.com/SlySven/Mudlet.git","ssh_url":"git@github.com:SlySven/Mudlet.git","clone_url":"https://github.com/SlySven/Mudlet.git","svn_url":"https://github.com/SlySven/Mudlet","homepage":null,"size":20740,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1,"mirror_url":null,"open_issues_count":1,"forks":1,"open_issues":1,"watchers":0,"default_branch":"development"}},"base":{"label":"Mudlet:development","ref":"development","sha":"d1bc6ea6444e7db178c71f339f5b5e9fcfe327ff","user":{"login":"Mudlet","id":6158612,"avatar_url":"https://avatars.githubusercontent.com/u/6158612?v=3","gravatar_id":"","url":"https://api.github.com/users/Mudlet","html_url":"https://github.com/Mudlet","followers_url":"https://api.github.com/users/Mudlet/followers","following_url":"https://api.github.com/users/Mudlet/following{/other_user}","gists_url":"https://api.github.com/users/Mudlet/gists{/gist_id}","starred_url":"https://api.github.com/users/Mudlet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mudlet/subscriptions","organizations_url":"https://api.github.com/users/Mudlet/orgs","repos_url":"https://api.github.com/users/Mudlet/repos","events_url":"https://api.github.com/users/Mudlet/events{/privacy}","received_events_url":"https://api.github.com/users/Mudlet/received_events","type":"Organization","site_admin":false},"repo":{"id":15108812,"name":"Mudlet","full_name":"Mudlet/Mudlet","owner":{"login":"Mudlet","id":6158612,"avatar_url":"https://avatars.githubusercontent.com/u/6158612?v=3","gravatar_id":"","url":"https://api.github.com/users/Mudlet","html_url":"https://github.com/Mudlet","followers_url":"https://api.github.com/users/Mudlet/followers","following_url":"https://api.github.com/users/Mudlet/following{/other_user}","gists_url":"https://api.github.com/users/Mudlet/gists{/gist_id}","starred_url":"https://api.github.com/users/Mudlet/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Mudlet/subscriptions","organizations_url":"https://api.github.com/users/Mudlet/orgs","repos_url":"https://api.github.com/users/Mudlet/repos","events_url":"https://api.github.com/users/Mudlet/events{/privacy}","received_events_url":"https://api.github.com/users/Mudlet/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Mudlet/Mudlet","description":"A modern open source MUD client with a graphical user inteface and full built in Lua scripting support for all major platforms.","fork":false,"url":"https://api.github.com/repos/Mudlet/Mudlet","forks_url":"https://api.github.com/repos/Mudlet/Mudlet/forks","keys_url":"https://api.github.com/repos/Mudlet/Mudlet/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Mudlet/Mudlet/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Mudlet/Mudlet/teams","hooks_url":"https://api.github.com/repos/Mudlet/Mudlet/hooks","issue_events_url":"https://api.github.com/repos/Mudlet/Mudlet/issues/events{/number}","events_url":"https://api.github.com/repos/Mudlet/Mudlet/events","assignees_url":"https://api.github.com/repos/Mudlet/Mudlet/assignees{/user}","branches_url":"https://api.github.com/repos/Mudlet/Mudlet/branches{/branch}","tags_url":"https://api.github.com/repos/Mudlet/Mudlet/tags","blobs_url":"https://api.github.com/repos/Mudlet/Mudlet/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Mudlet/Mudlet/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Mudlet/Mudlet/git/refs{/sha}","trees_url":"https://api.github.com/repos/Mudlet/Mudlet/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Mudlet/Mudlet/statuses/{sha}","languages_url":"https://api.github.com/repos/Mudlet/Mudlet/languages","stargazers_url":"https://api.github.com/repos/Mudlet/Mudlet/stargazers","contributors_url":"https://api.github.com/repos/Mudlet/Mudlet/contributors","subscribers_url":"https://api.github.com/repos/Mudlet/Mudlet/subscribers","subscription_url":"https://api.github.com/repos/Mudlet/Mudlet/subscription","commits_url":"https://api.github.com/repos/Mudlet/Mudlet/commits{/sha}","git_commits_url":"https://api.github.com/repos/Mudlet/Mudlet/git/commits{/sha}","comments_url":"https://api.github.com/repos/Mudlet/Mudlet/comments{/number}","issue_comment_url":"https://api.github.com/repos/Mudlet/Mudlet/issues/comments{/number}","contents_url":"https://api.github.com/repos/Mudlet/Mudlet/contents/{+path}","compare_url":"https://api.github.com/repos/Mudlet/Mudlet/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Mudlet/Mudlet/merges","archive_url":"https://api.github.com/repos/Mudlet/Mudlet/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Mudlet/Mudlet/downloads","issues_url":"https://api.github.com/repos/Mudlet/Mudlet/issues{/number}","pulls_url":"https://api.github.com/repos/Mudlet/Mudlet/pulls{/number}","milestones_url":"https://api.github.com/repos/Mudlet/Mudlet/milestones{/number}","notifications_url":"https://api.github.com/repos/Mudlet/Mudlet/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Mudlet/Mudlet/labels{/name}","releases_url":"https://api.github.com/repos/Mudlet/Mudlet/releases{/id}","deployments_url":"https://api.github.com/repos/Mudlet/Mudlet/deployments","created_at":"2013-12-11T14:04:21Z","updated_at":"2016-10-04T11:34:21Z","pushed_at":"2016-10-11T19:07:09Z","git_url":"git://github.com/Mudlet/Mudlet.git","ssh_url":"git@github.com:Mudlet/Mudlet.git","clone_url":"https://github.com/Mudlet/Mudlet.git","svn_url":"https://github.com/Mudlet/Mudlet","homepage":null,"size":21743,"stargazers_count":64,"watchers_count":64,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":37,"mirror_url":null,"open_issues_count":12,"forks":37,"open_issues":12,"watchers":64,"default_branch":"development"}},"_links":{"self":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326"},"html":{"href":"https://github.com/Mudlet/Mudlet/pull/326"},"issue":{"href":"https://api.github.com/repos/Mudlet/Mudlet/issues/326"},"comments":{"href":"https://api.github.com/repos/Mudlet/Mudlet/issues/326/comments"},"review_comments":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326/comments"},"review_comment":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Mudlet/Mudlet/pulls/326/commits"},"statuses":{"href":"https://api.github.com/repos/Mudlet/Mudlet/statuses/e50504cabd110cfb39f7b2d8f817d79a7ef91155"}}}}
{"actor":{"display_login":"vadi2"}}