// ------------------------------------------------------------------------------------ // ポジションを JsonTokenType.StartObject にした状態でコールすること // JsonTokenType.EndObject のポジションでリターンされる static void Chk_NextUser(ref JSON_Reader json_reader) { var uencip = new Uencip(); var uid = new Uid(); string str_uname = null; // user 情報の取得 while (true) { JsonTokenType next_type = json_reader.GetNextType(); if (next_type == JsonTokenType.PropertyName) { // key の取得 string str_key = json_reader.GetString(); // value の読み込み if (json_reader.GetNextType() != JsonTokenType.String) { continue; } string str_value = json_reader.GetString(); if (str_key == "name") { str_uname = str_value; } else if (str_key == "id") { uid.m_str_uid = str_value; } else if (str_key == "encip") { uencip.m_str_encip = str_value; } continue; } else if (next_type == JsonTokenType.EndObject) { if (str_uname == null || uid.m_str_uid == null) { throw new Exception("!!! JSON のパースに失敗しました。"); } // ホストの場合、str_encip == null となる if (uencip.m_str_encip == null) { return; } break; } throw new Exception("!!! JSON のパースに失敗しました。"); } // encip の調査 int eidx = msa_eip.IndexOf(uencip.m_str_encip); if (eidx < 0) { // 現セッションで新規登録の eip msa_eip.Add(uencip.m_str_encip); msa_unames_this_session.Add(NewStringList(str_uname)); msab_disp_new_user.Add(true); } else { // 現セッションで登録済みの eip // 新規の uname であれば、記録しておく var unames = msa_unames_this_session[eidx]; if (unames.IndexOf(str_uname) < 0) { unames.Add(str_uname); } } UInfo_onRoom.Attend(ref uid, str_uname, ref uencip); }
static void Chk_NextTalk(ref JSON_Reader json_reader) { string str_eip = null; string str_uname = null; string str_msgid = null; string str_uid = null; ulong val_time = 0; MsgType msg_type = MsgType.EN_None; while (true) { JsonTokenType next_type = json_reader.GetNextType(); if (next_type == JsonTokenType.PropertyName) { // key の取得 string str_key = json_reader.GetString(); // value の読み込み if (str_key == "time") { if (json_reader.GetNextType() != JsonTokenType.Number) { throw new Exception("!!! JSON のパースに失敗しました。"); } val_time = json_reader.GetUInt64(); continue; } if (json_reader.GetNextType() != JsonTokenType.String) { continue; } string str_value = json_reader.GetString(); if (str_key == "encip") { str_eip = str_value; } else if (str_key == "name") { str_uname = str_value; } else if (str_key == "id") { str_msgid = str_value; } else if (str_key == "uid") { str_uid = str_value; } else if (str_key == "type") { if (str_value == "enter") { msg_type = MsgType.EN_Enter; } else if (str_value == "exit") { msg_type = MsgType.EN_Exit; } } continue; } else if (next_type == JsonTokenType.EndObject) { break; } throw new Exception("!!! JSON のパースに失敗しました。"); } // ms_time_latest の更新 if (val_time > ms_time_latest) { ms_time_latest = val_time; } // msb_to_appear_AI_talk のチェック if (val_time > ms_time_for_AI_talk) { /* * MainForm.WriteStatus($"val_time -> {val_time}\r\n"); * MainForm.WriteStatus($"ms_time_for_AI_talk -> {ms_time_for_AI_talk}\r\n"); * if (str_msgid != null) * { MainForm.WriteStatus($"str_msgid -> {str_msgid}\r\n"); } */ if (ms_str_Uid_AI_talked != null && str_uid != null && str_uid == ms_str_Uid_AI_talked) { msb_to_appear_AI_talk = true; } ms_time_for_AI_talk = val_time; } if (msg_type == MsgType.EN_None) { return; } // 以下では、msg_type は EN_Enter or EN_Exit if (str_eip == null || str_uname == null || str_msgid == null || val_time == 0) { throw new Exception("!!! JSON のパースに失敗しました。"); } int eidx = msa_eip.IndexOf(str_eip); List <string> unames_this_session = null; bool b_disp_new_user = false; if (eidx < 0) { // Chk_NextUser() で検出できなかった eip ユーザの場合、ここにくる // bot がホストであれば、ここには来ないはず?(bot がゲストのときも考慮) msa_eip.Add(str_eip); unames_this_session = NewStringList(str_uname); msa_unames_this_session.Add(unames_this_session); b_disp_new_user = true; msab_disp_new_user.Add(true); eidx = msa_eip.Count - 1; } else { unames_this_session = msa_unames_this_session[eidx]; if (unames_this_session.IndexOf(str_uname) < 0) { unames_this_session.Add(str_uname); } b_disp_new_user = msab_disp_new_user[eidx]; } if (msg_type == MsgType.EN_Enter) { if (val_time < ms_time_for_msgid) { return; } if (MsgID_Chkr.IsNew_MsgID(str_msgid) == false) { return; } // str_msgid は、まだ未処理の msg であることに留意 // Enter メッセージの処理(再入室ユーザ、多窓ユーザの処理を行う) if (b_disp_new_user) { ms_ret_sb.Append("新規検出"); msab_disp_new_user[eidx] = false; //「新規検出」は表示したため、フラグを下ろしておく } else { ms_ret_sb.Append("---再入室者---"); } if (UInfo_onRoom.IsMultiUser(str_eip)) { ms_ret_sb.Append("★★★多窓ユーザ★★★"); } ms_ret_sb.Append($" [{str_uname}] / [{string.Join(", ", unames_this_session)}]\r\n\t{str_eip}\r\n\r\n"); // UInfo_onRoom に m_unames_this_session の情報を付加する UInfo_onRoom.Set_unames_this_session_by_enter_msg(str_eip, unames_this_session); } else { // Exit メッセージの処理(Exit であるため、多窓ユーザかどうかの判定はしない) // ExitEip_onTalks のチェックは、ms_time_for_msgid に関わらず必要なことに注意 int eidx_EUser = ExitEip_onTalks.Regist(str_eip, str_uname); if (val_time < ms_time_for_msgid) { return; } if (MsgID_Chkr.IsNew_MsgID(str_msgid) == false) { return; } ms_ret_sb.Append($"退室者 [{string.Join(", ", ExitEip_onTalks.GetUnames(eidx_EUser))}] / " + $"[{string.Join(", ", unames_this_session)}]\r\n" + $"\t{str_eip}\r\n\r\n"); } ms_time_for_msgid = val_time; }
public static StringBuilder Anlz_RoomJSON(byte[] buf_utf8) { // ------------------------------------------------------------ // users の解析 var json_reader = new JSON_Reader(buf_utf8); json_reader.Search_users_key(); UInfo_onRoom.Clear_AttendFlag(); // Remove_Absent() の準備 JsonTokenType type_lead = json_reader.GetNextType(); if (type_lead == JsonTokenType.StartObject) { // users がオブジェクト型の場合の処理 while (true) { JsonTokenType next_type = json_reader.GetNextType(); if (next_type == JsonTokenType.EndObject) { break; } if (next_type != JsonTokenType.PropertyName) { throw new Exception("!!! JSON のパースに失敗しました。"); } if (json_reader.GetNextType() != JsonTokenType.StartObject) { throw new Exception("!!! JSON のパースに失敗しました。"); } Chk_NextUser(ref json_reader); } } else { if (type_lead != JsonTokenType.StartArray) { throw new Exception("!!! JSON のパースに失敗しました。"); } // users が配列型の場合の処理 while (true) { JsonTokenType next_type = json_reader.GetNextType(); if (next_type == JsonTokenType.EndArray) { break; } if (next_type != JsonTokenType.StartObject) { throw new Exception("!!! JSON のパースに失敗しました。"); } Chk_NextUser(ref json_reader); } } UInfo_onRoom.Remove_Absent(); // ここで多窓のチェックも行う // ------------------------------------------------------------ // talks の解析 json_reader.Search_talks_key(); // JsonTokenType.StartArray の位置に設定される // Remove_disappeared() のための準備 MsgID_Chkr.Clear_OnTalksFlag(); ExitEip_onTalks.Clear_OnTalksFlag(); ms_ret_sb.Clear(); // 入室、退室の情報記録用 while (true) { JsonTokenType next_type = json_reader.GetNextType(); if (next_type == JsonTokenType.EndArray) { break; } if (next_type != JsonTokenType.StartObject) { throw new Exception("!!! JSON のパースに失敗しました。"); } Chk_NextTalk(ref json_reader); } MsgID_Chkr.Remove_disappeared(); ExitEip_onTalks.Remove_disappeared(); return(ms_ret_sb); }