{"action":"created","comment":{"url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/comments/78277109","id":78277109,"diff_hunk":"@@ -19,595 +19,561 @@\n #include \"StdAfx.h\"\n \n \n-/// \\todo refactoring\n-bool MailMessage::AddMessageDataToPacket(WorldPacket& data)\n+void WorldSession::HandleSendMail(WorldPacket& recv_data)\n {\n-    uint8 i = 0;\n-    uint32 j;\n-    std::vector<uint32>::iterator itr;\n+    CHECK_INWORLD_RETURN\n+\n+        MailMessage msg;\n+    ObjectGuid mailbox;\n+    uint32 unk1, unk2;\n+    uint64 money, COD;\n+    uint32 bodyLength, subjectLength, receiverLength;\n+    std::string receiver, subject, body;\n+\n+    std::vector< Item* > items;\n+    std::vector< Item* >::iterator itr;\n     Item* pItem;\n \n-    // add stuff\n-    if (deleted_flag)\n-        return false;\n+    recv_data >> unk1;\n+    recv_data >> unk2;\n \n-    uint8 guidsize;\n-    if (message_type == 0)\n-        guidsize = 8;\n-    else\n-        guidsize = 4;\n+    recv_data >> COD;\n+    recv_data >> money;\n \n-    size_t msize = 2 + 4 + 1 + guidsize + 4 * 8 + (subject.size() + 1) + (body.size() + 1) + 1 + (items.size() * (1 + 2 * 4 + 7 * (3 * 4) + 6 * 4 + 1));\n+    bodyLength = recv_data.readBits(12);\n+    subjectLength = recv_data.readBits(9);\n \n-    data << uint16(msize);     // message size\n-    data << uint32(message_id);\n-    data << uint8(message_type);\n+    uint8 items_count = recv_data.readBits(5);              // attached items count\n \n-    switch (message_type)\n+    if (items_count > MAIL_MAX_ITEM_SLOT)\n     {\n-        case MAIL_TYPE_NORMAL:\n-            data << uint64(sender_guid);\n-            break;\n-        case MAIL_TYPE_COD:\n-        case MAIL_TYPE_AUCTION:\n-        case MAIL_TYPE_ITEM:\n-            data << uint32(Arcemu::Util::GUID_LOPART(sender_guid));\n-            break;\n-        case MAIL_TYPE_GAMEOBJECT:\n-        case MAIL_TYPE_CREATURE:\n-            data << uint32(static_cast<uint32>(sender_guid));\n-            break;\n+        SendMailError(MAIL_ERR_TOO_MANY_ATTACHMENTS);\n+        return;\n     }\n \n-    data << uint32(cod);            // cod\n-    data << uint32(0);\n-    data << uint32(stationery);\n-    data << uint32(money);        // money\n-    data << uint32(checked_flag);           // \"checked\" flag\n-    data << float((expire_time - uint32(UNIXTIME)) / 86400.0f);\n-    data << uint32(0);    // mail template\n-    data << subject;\n-    data << body;\n+    mailbox[0] = recv_data.readBit();\n+\n+    ObjectGuid itemGUIDs[MAIL_MAX_ITEM_SLOT];\n+\n+    for (uint8 i = 0; i < items_count; ++i)\n+    {\n+        itemGUIDs[i][2] = recv_data.readBit();\n+        itemGUIDs[i][6] = recv_data.readBit();\n+        itemGUIDs[i][3] = recv_data.readBit();\n+        itemGUIDs[i][7] = recv_data.readBit();\n+        itemGUIDs[i][1] = recv_data.readBit();\n+        itemGUIDs[i][0] = recv_data.readBit();\n+        itemGUIDs[i][4] = recv_data.readBit();\n+        itemGUIDs[i][5] = recv_data.readBit();\n+    }\n+\n+    mailbox[3] = recv_data.readBit();\n+    mailbox[4] = recv_data.readBit();\n+    receiverLength = recv_data.readBits(7);\n+    mailbox[2] = recv_data.readBit();\n+    mailbox[6] = recv_data.readBit();\n+    mailbox[1] = recv_data.readBit();\n+    mailbox[7] = recv_data.readBit();\n+    mailbox[5] = recv_data.readBit();\n+\n+    recv_data.ReadByteSeq(mailbox[4]);\n+\n+    for (uint8 i = 0; i < items_count; ++i)\n+    {\n+        recv_data.ReadByteSeq(itemGUIDs[i][6]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][1]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][7]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][2]);\n+        recv_data.read_skip<uint8>();            // item slot in mail, not used\n+        recv_data.ReadByteSeq(itemGUIDs[i][3]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][0]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][4]);\n+        recv_data.ReadByteSeq(itemGUIDs[i][5]);\n+    }\n+\n+    recv_data.ReadByteSeq(mailbox[7]);\n+    recv_data.ReadByteSeq(mailbox[3]);\n+    recv_data.ReadByteSeq(mailbox[6]);\n+    recv_data.ReadByteSeq(mailbox[5]);\n+\n+    subject = recv_data.ReadString(subjectLength);\n+    receiver = recv_data.ReadString(receiverLength);\n+\n+    recv_data.ReadByteSeq(mailbox[2]);\n+    recv_data.ReadByteSeq(mailbox[0]);\n+\n+    body = recv_data.ReadString(bodyLength);\n+\n+    recv_data.ReadByteSeq(mailbox[1]);\n+\n+    // packet read complete, now do check\n+\n+    // Search for the recipient\n+    PlayerInfo* player = ObjectMgr::getSingleton().GetPlayerInfoByName(receiver.c_str());\n+    if (player == NULL)\n+    {\n+        SendMailError(MAIL_ERR_RECIPIENT_NOT_FOUND);\n+        return;\n+    }\n+\n+    for (uint8 i = 0; i < items_count; ++i)\n+    {\n+        pItem = _player->GetItemInterface()->GetItemByGUID(itemGUIDs[i]);\n+        if (pItem == NULL || pItem->IsSoulbound() || pItem->IsConjured())\n+        {\n+            SendMailError(MAIL_ERR_INTERNAL_ERROR);\n+            return;\n+        }\n+        if (pItem->IsAccountbound() && GetAccountId() != player->acct) // don't mail account-bound items to another account\n+        {\n+            WorldPacket data(SMSG_SEND_MAIL_RESULT, 16);\n+            data << uint32(0);\n+            data << uint32(0);\n+            data << uint32(MAIL_ERR_BAG_FULL);\n+            data << uint32(INV_ERR_ARTEFACTS_ONLY_FOR_OWN_CHARACTERS);\n+            SendPacket(&data);\n+            return;\n+        }\n+\n+        items.push_back(pItem);\n+    }\n+\n+    if (receiver.empty())\n+        return;\n+\n+    bool interfaction = false;\n+    if (sMailSystem.MailOption(MAIL_FLAG_CAN_SEND_TO_OPPOSITE_FACTION) || (HasGMPermissions() && sMailSystem.MailOption(MAIL_FLAG_CAN_SEND_TO_OPPOSITE_FACTION_GM)))\n+    {\n+        interfaction = true;\n+    }\n+\n+    // Check we're sending to the same faction (disable this for testing)\n+    if (player->team != _player->GetTeam() && !interfaction)\n+    {\n+        SendMailError(MAIL_ERR_NOT_YOUR_ALLIANCE);\n+        return;\n+    }\n+\n+    // Check if we're sending mail to ourselves\n+    if (strcmp(player->name, _player->GetName()) == 0 && !GetPermissionCount())\n+    {\n+        SendMailError(MAIL_ERR_CANNOT_SEND_TO_SELF);\n+        return;\n+    }\n+\n+    if (msg.stationery == MAIL_STATIONERY_GM && !HasGMPermissions())\n+    {\n+        SendMailError(MAIL_ERR_INTERNAL_ERROR);\n+        return;\n+    }\n+\n+    // Instant delivery time by default.\n+    msg.delivery_time = (uint32)UNIXTIME;\n+\n+    // Set up the cost\n+    uint32 cost = items_count ? 30 * items_count : 30;  // price hardcoded in client\n+\n+    uint64 reqmoney = cost + money;\n+\n+    if (!sMailSystem.MailOption(MAIL_FLAG_DISABLE_POSTAGE_COSTS) && !(GetPermissionCount() && sMailSystem.MailOption(MAIL_FLAG_NO_COST_FOR_GM)))\n+    {\n+        cost += 30;\n+    }\n \n-    data << uint8(items.size());        // item count\n+    // check that we have enough in our backpack\n+    if (!_player->HasGold(cost))\n+    {\n+        SendMailError(MAIL_ERR_NOT_ENOUGH_MONEY);\n+        return;\n+    }\n \n+    // Check for the item, and required item.\n     if (!items.empty())\n     {\n         for (itr = items.begin(); itr != items.end(); ++itr)\n         {\n-            pItem = objmgr.LoadItem(*itr);\n-            if (pItem == NULL)\n-                continue;\n+            pItem = *itr;\n+            if (_player->GetItemInterface()->SafeRemoveAndRetreiveItemByGuid(pItem->GetGUID(), false) != pItem)\n+                continue;        // should never be hit.\n \n-            data << uint8(i++);\n-            data << uint32(pItem->GetLowGUID());\n-            data << uint32(pItem->GetEntry());\n+            pItem->RemoveFromWorld();\n+            pItem->SetOwner(NULL);\n+            pItem->SaveToDB(INVENTORY_SLOT_NOT_SET, 0, true, NULL);\n+            msg.items.push_back(pItem->GetLowGUID());\n \n-            for (j = 0; j < 7; ++j)\n+            if (GetPermissionCount() > 0)\n             {\n-                data << uint32(pItem->GetEnchantmentId(j));\n-                data << uint32(pItem->GetEnchantmentDuration(j));\n-                data << uint32(0);\n+                /* log the message */\n+                sGMLog.writefromsession(this, \"sent mail with item entry %u to %s, with gold %u.\", pItem->GetEntry(), player->name, money);\n             }\n \n-            data << uint32(pItem->GetItemRandomPropertyId());\n-            data << uint32(pItem->GetItemRandomSuffixFactor());\n-            data << uint32(pItem->GetStackCount());\n-            data << uint32(pItem->GetChargesLeft());\n-            data << uint32(pItem->GetDurabilityMax());\n-            data << uint32(pItem->GetDurability());\n-            data << uint8(0);   // unknown\n+            pItem->DeleteMe();\n+        }\n+    }\n+\n+    if (money != 0 || COD != 0 || (!items.size() && player->acct != _player->GetSession()->GetAccountId()))\n+    {\n+        if (!sMailSystem.MailOption(MAIL_FLAG_DISABLE_HOUR_DELAY_FOR_ITEMS))\n+            msg.delivery_time += 3600;  // 1hr\n+    }\n+\n+    // take the money\n+    _player->ModGold(-cost);\n+\n+    // Fill in the rest of the info\n+    msg.player_guid = player->guid;\n+    msg.sender_guid = _player->GetGUID();\n+    msg.money = money;\n+    msg.cod = COD;\n+    msg.subject = subject;\n+    msg.body = body;\n+\n+    // 30 day expiry time for unread mail\n+    if (!sMailSystem.MailOption(MAIL_FLAG_NO_EXPIRY))\n+        msg.expire_time = (uint32)UNIXTIME + (TIME_DAY * MAIL_DEFAULT_EXPIRATION_TIME);\n+    else\n+        msg.expire_time = 0;\n+\n+    msg.deleted_flag = false;\n+    msg.message_type = 0;\n+    msg.checked_flag = msg.body.empty() ? MAIL_CHECK_MASK_COPIED : MAIL_CHECK_MASK_HAS_BODY;\n+\n+    // Great, all our info is filled in. Now we can add it to the other players mailbox.\n+    sMailSystem.DeliverMessage(player->guid, &msg);\n+    // Save/Update character's gold if they've received gold that is. This prevents a rollback.\n+    CharacterDatabase.Execute(\"UPDATE characters SET gold = %u WHERE guid = %u\", _player->GetGold(), _player->m_playerInfo->guid);\n+    // Success packet :)\n+    SendMailError(MAIL_OK);\n+}\n+\n+void WorldSession::HandleMarkAsRead(WorldPacket& recv_data)\n+{\n+    CHECK_INWORLD_RETURN\n+\n+    uint64 mailbox;\n+    uint32 message_id;\n+    recv_data >> mailbox;\n+    recv_data >> message_id;\n+\n+    MailMessage* message = _player->m_mailBox.GetMessage(message_id);\n+    if (message == 0)\n+        return;\n+\n+    // mark the message as read\n+    message->checked_flag |= MAIL_CHECK_MASK_READ;\n+\n+    // mail now has a 30 day expiry time\n+    if (!sMailSystem.MailOption(MAIL_FLAG_NO_EXPIRY))\n+        message->expire_time = (uint32)UNIXTIME + (TIME_DAY * 30);\n+\n+    // update it in sql\n+    CharacterDatabase.WaitExecute(\"UPDATE mailbox SET checked_flag = %u, expiry_time = %u WHERE message_id = %u\",\n+                                  message->checked_flag, message->expire_time, message->message_id);\n+}\n+\n+void WorldSession::HandleMailDelete(WorldPacket& recv_data)\n+{\n+    CHECK_INWORLD_RETURN\n+\n+    uint64 mailbox;\n+    uint32 message_id;\n+    recv_data >> mailbox;\n+    recv_data >> message_id;\n+    recv_data.read_skip<uint32>();\n+\n+    WorldPacket data(SMSG_SEND_MAIL_RESULT, 12);\n+    data << message_id;\n+    data << uint32(MAIL_RES_DELETED);\n+\n+    MailMessage* message = _player->m_mailBox.GetMessage(message_id);\n+    if (message == 0)\n+    {\n+        data << uint32(MAIL_ERR_INTERNAL_ERROR);\n+        SendPacket(&data);\n+        return;\n+    }\n+\n+    _player->m_mailBox.DeleteMessage(message_id, true);\n+\n+    data << uint32(MAIL_OK);\n+    SendPacket(&data);\n+}\n+\n+void WorldSession::HandleTakeItem(WorldPacket& recv_data)\n+{\n+    CHECK_INWORLD_RETURN\n+\n+    uint64 mailbox;\n+    uint32 message_id;\n+    uint32 lowguid;\n+    std::vector< uint32 >::iterator itr;\n+\n+    recv_data >> mailbox;\n+    recv_data >> message_id;\n+    recv_data >> lowguid;\n+\n+    WorldPacket data(SMSG_SEND_MAIL_RESULT, 12);\n+    data << message_id;\n+    data << uint32(MAIL_RES_ITEM_TAKEN);\n+\n+    MailMessage* message = _player->m_mailBox.GetMessage(message_id);\n+    if (message == 0 || message->items.empty())","path":"src/world/Server/Packets/Handlers/MailHandler.cpp","position":359,"original_position":359,"commit_id":"0365d2b1c12d9ce682951e1b4faa6d14256cf5be","original_commit_id":"95d1c05e87a2957faf0cd92845537a411b7f6629","user":{"login":"Zyres","id":8825392,"avatar_url":"https://avatars.githubusercontent.com/u/8825392?v=3","gravatar_id":"","url":"https://api.github.com/users/Zyres","html_url":"https://github.com/Zyres","followers_url":"https://api.github.com/users/Zyres/followers","following_url":"https://api.github.com/users/Zyres/following{/other_user}","gists_url":"https://api.github.com/users/Zyres/gists{/gist_id}","starred_url":"https://api.github.com/users/Zyres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Zyres/subscriptions","organizations_url":"https://api.github.com/users/Zyres/orgs","repos_url":"https://api.github.com/users/Zyres/repos","events_url":"https://api.github.com/users/Zyres/events{/privacy}","received_events_url":"https://api.github.com/users/Zyres/received_events","type":"User","site_admin":false},"body":"message == nullptr not 0!","created_at":"2016-09-10T13:14:12Z","updated_at":"2016-09-10T13:14:12Z","html_url":"https://github.com/AscEmu/AscEmu/pull/341#discussion_r78277109","pull_request_url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341","_links":{"self":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/comments/78277109"},"html":{"href":"https://github.com/AscEmu/AscEmu/pull/341#discussion_r78277109"},"pull_request":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341"}}},"pull_request":{"url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341","id":84735274,"html_url":"https://github.com/AscEmu/AscEmu/pull/341","diff_url":"https://github.com/AscEmu/AscEmu/pull/341.diff","patch_url":"https://github.com/AscEmu/AscEmu/pull/341.patch","issue_url":"https://api.github.com/repos/AscEmu/AscEmu/issues/341","number":341,"state":"open","locked":false,"title":"Spell/Skill/Packets","user":{"login":"DankoDJ","id":8471416,"avatar_url":"https://avatars.githubusercontent.com/u/8471416?v=3","gravatar_id":"","url":"https://api.github.com/users/DankoDJ","html_url":"https://github.com/DankoDJ","followers_url":"https://api.github.com/users/DankoDJ/followers","following_url":"https://api.github.com/users/DankoDJ/following{/other_user}","gists_url":"https://api.github.com/users/DankoDJ/gists{/gist_id}","starred_url":"https://api.github.com/users/DankoDJ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DankoDJ/subscriptions","organizations_url":"https://api.github.com/users/DankoDJ/orgs","repos_url":"https://api.github.com/users/DankoDJ/repos","events_url":"https://api.github.com/users/DankoDJ/events{/privacy}","received_events_url":"https://api.github.com/users/DankoDJ/received_events","type":"User","site_admin":false},"body":"Todo list:\r\n'''add commits from CATA branch'''\r\n- [x] Trainers\r\n- [x] Vendors\r\n- [x] Taxi opcodes\r\n- [x] Mailbox opcodes\r\n- [x] Auction House\r\n- [x] Talent Tree","created_at":"2016-09-09T23:43:59Z","updated_at":"2016-09-10T13:14:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"20328980289da15dcb5c34c4a2c38dc4b62f8192","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341/commits","review_comments_url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341/comments","review_comment_url":"https://api.github.com/repos/AscEmu/AscEmu/pulls/comments{/number}","comments_url":"https://api.github.com/repos/AscEmu/AscEmu/issues/341/comments","statuses_url":"https://api.github.com/repos/AscEmu/AscEmu/statuses/0365d2b1c12d9ce682951e1b4faa6d14256cf5be","head":{"label":"DankoDJ:4.3.4","ref":"4.3.4","sha":"0365d2b1c12d9ce682951e1b4faa6d14256cf5be","user":{"login":"DankoDJ","id":8471416,"avatar_url":"https://avatars.githubusercontent.com/u/8471416?v=3","gravatar_id":"","url":"https://api.github.com/users/DankoDJ","html_url":"https://github.com/DankoDJ","followers_url":"https://api.github.com/users/DankoDJ/followers","following_url":"https://api.github.com/users/DankoDJ/following{/other_user}","gists_url":"https://api.github.com/users/DankoDJ/gists{/gist_id}","starred_url":"https://api.github.com/users/DankoDJ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DankoDJ/subscriptions","organizations_url":"https://api.github.com/users/DankoDJ/orgs","repos_url":"https://api.github.com/users/DankoDJ/repos","events_url":"https://api.github.com/users/DankoDJ/events{/privacy}","received_events_url":"https://api.github.com/users/DankoDJ/received_events","type":"User","site_admin":false},"repo":{"id":67818954,"name":"AscEmu","full_name":"DankoDJ/AscEmu","owner":{"login":"DankoDJ","id":8471416,"avatar_url":"https://avatars.githubusercontent.com/u/8471416?v=3","gravatar_id":"","url":"https://api.github.com/users/DankoDJ","html_url":"https://github.com/DankoDJ","followers_url":"https://api.github.com/users/DankoDJ/followers","following_url":"https://api.github.com/users/DankoDJ/following{/other_user}","gists_url":"https://api.github.com/users/DankoDJ/gists{/gist_id}","starred_url":"https://api.github.com/users/DankoDJ/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/DankoDJ/subscriptions","organizations_url":"https://api.github.com/users/DankoDJ/orgs","repos_url":"https://api.github.com/users/DankoDJ/repos","events_url":"https://api.github.com/users/DankoDJ/events{/privacy}","received_events_url":"https://api.github.com/users/DankoDJ/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/DankoDJ/AscEmu","description":"AscEmu... a never ending place to work.","fork":true,"url":"https://api.github.com/repos/DankoDJ/AscEmu","forks_url":"https://api.github.com/repos/DankoDJ/AscEmu/forks","keys_url":"https://api.github.com/repos/DankoDJ/AscEmu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/DankoDJ/AscEmu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/DankoDJ/AscEmu/teams","hooks_url":"https://api.github.com/repos/DankoDJ/AscEmu/hooks","issue_events_url":"https://api.github.com/repos/DankoDJ/AscEmu/issues/events{/number}","events_url":"https://api.github.com/repos/DankoDJ/AscEmu/events","assignees_url":"https://api.github.com/repos/DankoDJ/AscEmu/assignees{/user}","branches_url":"https://api.github.com/repos/DankoDJ/AscEmu/branches{/branch}","tags_url":"https://api.github.com/repos/DankoDJ/AscEmu/tags","blobs_url":"https://api.github.com/repos/DankoDJ/AscEmu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/DankoDJ/AscEmu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/DankoDJ/AscEmu/git/refs{/sha}","trees_url":"https://api.github.com/repos/DankoDJ/AscEmu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/DankoDJ/AscEmu/statuses/{sha}","languages_url":"https://api.github.com/repos/DankoDJ/AscEmu/languages","stargazers_url":"https://api.github.com/repos/DankoDJ/AscEmu/stargazers","contributors_url":"https://api.github.com/repos/DankoDJ/AscEmu/contributors","subscribers_url":"https://api.github.com/repos/DankoDJ/AscEmu/subscribers","subscription_url":"https://api.github.com/repos/DankoDJ/AscEmu/subscription","commits_url":"https://api.github.com/repos/DankoDJ/AscEmu/commits{/sha}","git_commits_url":"https://api.github.com/repos/DankoDJ/AscEmu/git/commits{/sha}","comments_url":"https://api.github.com/repos/DankoDJ/AscEmu/comments{/number}","issue_comment_url":"https://api.github.com/repos/DankoDJ/AscEmu/issues/comments{/number}","contents_url":"https://api.github.com/repos/DankoDJ/AscEmu/contents/{+path}","compare_url":"https://api.github.com/repos/DankoDJ/AscEmu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/DankoDJ/AscEmu/merges","archive_url":"https://api.github.com/repos/DankoDJ/AscEmu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/DankoDJ/AscEmu/downloads","issues_url":"https://api.github.com/repos/DankoDJ/AscEmu/issues{/number}","pulls_url":"https://api.github.com/repos/DankoDJ/AscEmu/pulls{/number}","milestones_url":"https://api.github.com/repos/DankoDJ/AscEmu/milestones{/number}","notifications_url":"https://api.github.com/repos/DankoDJ/AscEmu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/DankoDJ/AscEmu/labels{/name}","releases_url":"https://api.github.com/repos/DankoDJ/AscEmu/releases{/id}","deployments_url":"https://api.github.com/repos/DankoDJ/AscEmu/deployments","created_at":"2016-09-09T17:31:28Z","updated_at":"2016-09-09T17:31:34Z","pushed_at":"2016-09-10T09:17:52Z","git_url":"git://github.com/DankoDJ/AscEmu.git","ssh_url":"git@github.com:DankoDJ/AscEmu.git","clone_url":"https://github.com/DankoDJ/AscEmu.git","svn_url":"https://github.com/DankoDJ/AscEmu","homepage":"http://www.ascemu.org","size":29533,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"3.3.5"}},"base":{"label":"AscEmu:4.3.4","ref":"4.3.4","sha":"fbd52a544e439e1acb6e70d2b016164f4d2d6f89","user":{"login":"AscEmu","id":8471310,"avatar_url":"https://avatars.githubusercontent.com/u/8471310?v=3","gravatar_id":"","url":"https://api.github.com/users/AscEmu","html_url":"https://github.com/AscEmu","followers_url":"https://api.github.com/users/AscEmu/followers","following_url":"https://api.github.com/users/AscEmu/following{/other_user}","gists_url":"https://api.github.com/users/AscEmu/gists{/gist_id}","starred_url":"https://api.github.com/users/AscEmu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AscEmu/subscriptions","organizations_url":"https://api.github.com/users/AscEmu/orgs","repos_url":"https://api.github.com/users/AscEmu/repos","events_url":"https://api.github.com/users/AscEmu/events{/privacy}","received_events_url":"https://api.github.com/users/AscEmu/received_events","type":"Organization","site_admin":false},"repo":{"id":23041371,"name":"AscEmu","full_name":"AscEmu/AscEmu","owner":{"login":"AscEmu","id":8471310,"avatar_url":"https://avatars.githubusercontent.com/u/8471310?v=3","gravatar_id":"","url":"https://api.github.com/users/AscEmu","html_url":"https://github.com/AscEmu","followers_url":"https://api.github.com/users/AscEmu/followers","following_url":"https://api.github.com/users/AscEmu/following{/other_user}","gists_url":"https://api.github.com/users/AscEmu/gists{/gist_id}","starred_url":"https://api.github.com/users/AscEmu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/AscEmu/subscriptions","organizations_url":"https://api.github.com/users/AscEmu/orgs","repos_url":"https://api.github.com/users/AscEmu/repos","events_url":"https://api.github.com/users/AscEmu/events{/privacy}","received_events_url":"https://api.github.com/users/AscEmu/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/AscEmu/AscEmu","description":"AscEmu... a never ending place to work.","fork":false,"url":"https://api.github.com/repos/AscEmu/AscEmu","forks_url":"https://api.github.com/repos/AscEmu/AscEmu/forks","keys_url":"https://api.github.com/repos/AscEmu/AscEmu/keys{/key_id}","collaborators_url":"https://api.github.com/repos/AscEmu/AscEmu/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/AscEmu/AscEmu/teams","hooks_url":"https://api.github.com/repos/AscEmu/AscEmu/hooks","issue_events_url":"https://api.github.com/repos/AscEmu/AscEmu/issues/events{/number}","events_url":"https://api.github.com/repos/AscEmu/AscEmu/events","assignees_url":"https://api.github.com/repos/AscEmu/AscEmu/assignees{/user}","branches_url":"https://api.github.com/repos/AscEmu/AscEmu/branches{/branch}","tags_url":"https://api.github.com/repos/AscEmu/AscEmu/tags","blobs_url":"https://api.github.com/repos/AscEmu/AscEmu/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/AscEmu/AscEmu/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/AscEmu/AscEmu/git/refs{/sha}","trees_url":"https://api.github.com/repos/AscEmu/AscEmu/git/trees{/sha}","statuses_url":"https://api.github.com/repos/AscEmu/AscEmu/statuses/{sha}","languages_url":"https://api.github.com/repos/AscEmu/AscEmu/languages","stargazers_url":"https://api.github.com/repos/AscEmu/AscEmu/stargazers","contributors_url":"https://api.github.com/repos/AscEmu/AscEmu/contributors","subscribers_url":"https://api.github.com/repos/AscEmu/AscEmu/subscribers","subscription_url":"https://api.github.com/repos/AscEmu/AscEmu/subscription","commits_url":"https://api.github.com/repos/AscEmu/AscEmu/commits{/sha}","git_commits_url":"https://api.github.com/repos/AscEmu/AscEmu/git/commits{/sha}","comments_url":"https://api.github.com/repos/AscEmu/AscEmu/comments{/number}","issue_comment_url":"https://api.github.com/repos/AscEmu/AscEmu/issues/comments{/number}","contents_url":"https://api.github.com/repos/AscEmu/AscEmu/contents/{+path}","compare_url":"https://api.github.com/repos/AscEmu/AscEmu/compare/{base}...{head}","merges_url":"https://api.github.com/repos/AscEmu/AscEmu/merges","archive_url":"https://api.github.com/repos/AscEmu/AscEmu/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/AscEmu/AscEmu/downloads","issues_url":"https://api.github.com/repos/AscEmu/AscEmu/issues{/number}","pulls_url":"https://api.github.com/repos/AscEmu/AscEmu/pulls{/number}","milestones_url":"https://api.github.com/repos/AscEmu/AscEmu/milestones{/number}","notifications_url":"https://api.github.com/repos/AscEmu/AscEmu/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/AscEmu/AscEmu/labels{/name}","releases_url":"https://api.github.com/repos/AscEmu/AscEmu/releases{/id}","deployments_url":"https://api.github.com/repos/AscEmu/AscEmu/deployments","created_at":"2014-08-17T13:43:22Z","updated_at":"2016-09-09T12:11:35Z","pushed_at":"2016-09-10T09:17:53Z","git_url":"git://github.com/AscEmu/AscEmu.git","ssh_url":"git@github.com:AscEmu/AscEmu.git","clone_url":"https://github.com/AscEmu/AscEmu.git","svn_url":"https://github.com/AscEmu/AscEmu","homepage":"http://www.ascemu.org","size":31116,"stargazers_count":20,"watchers_count":20,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":23,"mirror_url":null,"open_issues_count":71,"forks":23,"open_issues":71,"watchers":20,"default_branch":"3.3.5"}},"_links":{"self":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341"},"html":{"href":"https://github.com/AscEmu/AscEmu/pull/341"},"issue":{"href":"https://api.github.com/repos/AscEmu/AscEmu/issues/341"},"comments":{"href":"https://api.github.com/repos/AscEmu/AscEmu/issues/341/comments"},"review_comments":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341/comments"},"review_comment":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/AscEmu/AscEmu/pulls/341/commits"},"statuses":{"href":"https://api.github.com/repos/AscEmu/AscEmu/statuses/0365d2b1c12d9ce682951e1b4faa6d14256cf5be"}}}}
{"actor":{"display_login":"Zyres"}}