예제 #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;
        }
예제 #2
0
        // ------------------------------------------------------------------------------------
        // ポジションを 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);
        }