Ejemplo n.º 1
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);
        }
Ejemplo n.º 2
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;
        }
Ejemplo n.º 3
0
            public async void OnClk_Btn_BAN()
            {
//				MainForm.WriteStatus($"OnClk_Btn_BAN(): m_id_this_session -> {m_id_this_session}\r\n");

                if (m_id_this_session == 0)
                {
                    MainForm.WriteStatus("!!! エラー検出: m_id_this_session == 0 in BanCtrl.OnClk_Btn_BAN()\r\n"); return;
                }
//				{ throw new Exception("!!! エラー検出: m_id_this_session == 0 in BanCtrl.OnClk_Btn_BAN()"); }

                // まず DB_static に encip を登録しておく
                DB_static.Regist(m_encip);

                mb_Rgst_ban = true;
                mb_Exec_Ban = true;

                m_GUI.m_Btn_AI_talk.Enabled = false;
                m_GUI.m_Btn_ban.Enabled     = false;

                if (m_id_this_session > 0)
                {
                    // 入室者の BAN 処理
                    m_GUI.m_TBox_info.BackColor = Color.HotPink;

                    Drrr_Host2.HttpTask ban_usr_task = Drrr_Host2.BanUsr_Task_Factory.Create(m_uinfo.m_uid.m_str_uid);
                    if (ban_usr_task.m_str_cancel == null)
                    {
                        try
                        {
                            await ban_usr_task.DoWork();
                        }
                        catch (Exception ex)
                        {
                            ban_usr_task.m_str_cancel = ex.ToString() + "\r\n";
                        }
                    }
                    // まとめてエラー処理を行う
                    if (ban_usr_task.m_str_cancel != null)
                    {
                        MainForm.WriteStatus($"!!! 「BanUsr」がキャンセルされました。\r\n{ban_usr_task.m_str_cancel}");
                        m_GUI.m_Btn_AI_talk.Enabled = true;
                        m_GUI.m_Btn_ban.Enabled     = true;
                        return;
                    }

                    // 受信メッセージを表示する
                    byte[] bytes_utf8 = await ban_usr_task.m_http_res.Content.ReadAsByteArrayAsync();

                    m_sb_ban_ret_msg.Clear();
                    m_sb_ban_ret_msg.Append(System.Text.Encoding.UTF8.GetString(bytes_utf8));
                    m_sb_ban_ret_msg.Append($"-> [{m_uinfo.m_uname}]\r\n");

                    // 強制退室 or 部屋にいませんでした の2択になるため、その判定が必要
                    string ret_str = m_sb_ban_ret_msg.ToString();
                    if (ret_str.Contains("強制退室") == false)
                    {
                        // 強制退室失敗
                        m_GUI.m_Btn_AI_talk.Enabled = true;
                        m_GUI.m_Btn_ban.Enabled     = true;
                    }

                    MainForm.WriteStatus(ret_str);
                }
                else
                {
                    // 退室者の BAN 処理
                    m_GUI.m_TBox_info.BackColor = Color.LightPink;

                    // 退室者の eip to ban 登録
                    ExitEip_onTalks.Regist_to_BAN(m_encip);
                }
            }