Example #1
0
        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;
        }
Example #2
0
        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);
        }