public static async Task <bool> MarkAsReadMails(string player_id, List <string> messageIds) { var msg = new claimItems.request.msg(); msg.messageIds = messageIds.ToArray(); string response = await WebAPIClient.Web.request(player_id, "/message/markAsRead", JsonConvert.SerializeObject(msg)); if (response == string.Empty) { Log.Error($"GetMailItems {player_id} empty markAsRead"); return(false); } return(true); }
public static async Task <(bool, ItemList, Goods)> GetMailItems(Session session, List <string> items, int characterId) { ItemList reply_items = new ItemList(); Goods reply_goods = new Goods(); int changed_item_id = 0; if (items == null || items.Count == 0) { items = new List <string>(); string characterPieceReward = ((int)GameItemId.CharacterPieceReward).ToString(); getList.response.msg last_msg = null; long?nextPageKey = null; do { var str = await GetMails(session.member_no, session.user_no, 100, nextPageKey); if (str == string.Empty) { break; } last_msg = JsonConvert.DeserializeObject <getList.response.msg>(str); if (last_msg == null) { break; } foreach (var mail in last_msg.messages) { // 우편에 아이템이 없는 경우 스킵 (시스템우편) if (mail.items.Length == 0) { continue; } // 캐릭터 조각 선택 아이템 스킵 if (mail.items[0].itemId == characterPieceReward) { continue; } items.Add(mail.message.messageId); } nextPageKey = last_msg.nextPageKey; } while (last_msg.nextPageKey != -1); } else if (items.Count == 1 && characterId != 0) { var game_item_data = ACDC.GameItemData.Values.Where(x => x.Item_Type == (int)GameItemType.CharacterPiece && x.LinkId == characterId).FirstOrDefault(); if (game_item_data == null || game_item_data == default) { Log.Error($"GetMailItems {session.player_id} cannot find character : {characterId}"); return(false, reply_items, reply_goods); } var characters = await CharacterCache.Instance.GetEntities(session.member_no, session.user_no, true); if (characters.IsAvailable(game_item_data.id) == false) { Log.Error($"GetMailItems {session.player_id} cannot receive character piece : {characterId}"); return(false, reply_items, reply_goods); } changed_item_id = game_item_data.id; } if (items.Count == 0) { Log.Error($"GetMailItems {session.player_id} empty messages"); return(false, reply_items, reply_goods); } var msg = new claimItems.request.msg(); msg.messageIds = items.ToArray(); string response = await WebAPIClient.Web.request(session.player_id, "/message/claimItems", JsonConvert.SerializeObject(msg)); if (response == string.Empty) { Log.Error($"GetMailItems {session.player_id} empty claimItems"); return(false, reply_items, reply_goods); } var mail_results = new Dictionary <int, int>(); var success_msgs = new List <string>(); var responseMsg = JsonConvert.DeserializeObject <claimItems.response.msg>(response); foreach (var result in responseMsg.results) { // 정상 메시지 체크 if (result.status != 200) { continue; } foreach (var item in result.items) { var item_id = int.Parse(item.itemCode); // 받을 아이템이 캐릭터 조각 보상이면 캐릭터 조각으로 변경 if (item_id == (int)GameItemId.CharacterPieceReward) { item_id = changed_item_id; } mail_results.Increment(item_id, (int)item.quantity); } success_msgs.Add(result.messageId); } await using (var mylock = await RedLock.CreateLockAsync($"lock:session:{session.session_id}")) { await using (var user = await UserCache.GetUser(session.member_no, session.user_no, true, true, false)) await using (var character = await CharacterCache.Instance.GetEntity(session.member_no, session.character_no, true, true, false)) { foreach (var mail_result in mail_results) { await Inventory.Insert(session, user, character, mail_result.Key, mail_result.Value, new LogReason("A_MAIL"), reply_items); } reply_goods?.Set(user); } } // 정상적으로 처리된 메시지만 finish 처리한다. msg.messageIds = success_msgs.ToArray(); response = await WebAPIClient.Web.request(session.player_id, "/message/finish", JsonConvert.SerializeObject(msg)); if (response == string.Empty) { Log.Error($"GetMailItems {session.player_id} finish"); } return(true, reply_items, reply_goods); }