diff --git a/qqinterface/src/main/java/KQQ/BatchResponse.java b/qqinterface/src/main/java/KQQ/BatchResponse.java new file mode 100644 index 0000000..d2a6963 --- /dev/null +++ b/qqinterface/src/main/java/KQQ/BatchResponse.java @@ -0,0 +1,10 @@ +package KQQ; + +import com.qq.jce.JceStruct; + +public final class BatchResponse extends JceStruct { + public byte[] buffer; + public int result; + public int seq; + public int type; +} \ No newline at end of file diff --git a/qqinterface/src/main/java/KQQ/RespBatchProcess.java b/qqinterface/src/main/java/KQQ/RespBatchProcess.java new file mode 100644 index 0000000..7ccea6b --- /dev/null +++ b/qqinterface/src/main/java/KQQ/RespBatchProcess.java @@ -0,0 +1,9 @@ +package KQQ; + +import com.qq.jce.JceStruct; + +import java.util.ArrayList; + +public final class RespBatchProcess extends JceStruct { + public ArrayList batch_response_list; +} diff --git a/qqinterface/src/main/java/com/tencent/mobileqq/troop/api/ITroopHandlerNameApi.java b/qqinterface/src/main/java/com/tencent/mobileqq/troop/api/ITroopHandlerNameApi.java new file mode 100644 index 0000000..a79d5bf --- /dev/null +++ b/qqinterface/src/main/java/com/tencent/mobileqq/troop/api/ITroopHandlerNameApi.java @@ -0,0 +1,97 @@ +package com.tencent.mobileqq.troop.api; + +import com.tencent.mobileqq.qroute.QRouteApi; + +public interface ITroopHandlerNameApi extends QRouteApi { + String getTroopAddFriendHandlerName(); + + String getTroopAioNotifyHandlerName(); + + String getTroopAnnouncementHandlerName(); + + String getTroopAnonymousHandlerName(); + + String getTroopAppHandlerName(); + + String getTroopAssociationHandlerName(); + + String getTroopAvatarHandlerName(); + + String getTroopBatchInfoHandlerName(); + + String getTroopClockInHandlerName(); + + String getTroopCommonlyUsedHandlerName(); + + String getTroopConfigHandlerName(); + + String getTroopEssenceHandlerName(); + + String getTroopFansHandlerName(); + + String getTroopFeeHandlerName(); + + String getTroopGagHandlerName(); + + String getTroopGameHandlerName(); + + String getTroopHomeworkHandlerName(); + + String getTroopHonorHandlerName(); + + String getTroopInfoExtHandlerName(); + + String getTroopInfoHandlerName(); + + String getTroopListHandlerName(); + + String getTroopLuckyCharacterHandlerName(); + + String getTroopManagerBizHandlerName(); + + String getTroopMemberCardHandlerName(); + + String getTroopMemberInfoHandlerName(); + + String getTroopMemberLevelHandlerName(); + + String getTroopMemberListHandlerName(); + + String getTroopMemberMngHandlerName(); + + String getTroopMessageHandlerName(); + + String getTroopMngHandlerName(); + + String getTroopModifyHandlerName(); + + String getTroopNavigateMessageHandlerName(); + + String getTroopNotificationHandlerName(); + + String getTroopOnlineMemberHandlerName(); + + String getTroopOnlinePushHandlerName(); + + String getTroopPhotoHandlerName(); + + String getTroopPushHandlerName(); + + String getTroopRecommendHandlerName(); + + String getTroopRedDotHandlerName(); + + String getTroopRoamSettingHandlerName(); + + String getTroopRobotHandlerName(); + + String getTroopSettingHandlerName(); + + String getTroopShowExternalHandlerName(); + + String getTroopSurveyHandlerName(); + + String getTroopTokenHandlerName(); + + String getTroopTrpcHandlerName(); +} diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0x787/oidb_0x787.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0x787/oidb_0x787.java new file mode 100644 index 0000000..f27dd9e --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0x787/oidb_0x787.java @@ -0,0 +1,109 @@ +package tencent.im.oidb.cmd0x787; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class oidb_0x787 { + public static final class RspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_admin_name; + public final PBBytesField bytes_owner_name; + public final PBRepeatMessageField rpt_msg_level_name_new; + public final PBUInt32Field uint32_level_name_seq; + public final PBUInt32Field uint32_office_mode; + public final PBUInt32Field uint32_seq; + public final PBUInt32Field uint32_user_show_flag_new; + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBRepeatMessageField rpt_msg_member_level_info = PBField.initRepeatMessage(MemberLevelInfo.class); + public final PBRepeatMessageField rpt_msg_level_name = PBField.initRepeatMessage(LevelName.class); + public final PBUInt64Field uint64_end_uin = PBField.initUInt64(0); + public final PBUInt64Field uint64_data_time = PBField.initUInt64(0); + public final PBUInt32Field uint32_user_show_flag = PBField.initUInt32(0); + public final PBUInt32Field uint32_sys_show_flag = PBField.initUInt32(0); + public final PBUInt32Field uint32_time_to_update = PBField.initUInt32(0); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 26, 32, 40, 48, 56, 64, 74, 82, 88, 96, 104, 112, 122}, new String[]{"uint64_group_code", "rpt_msg_member_level_info", "rpt_msg_level_name", "uint64_end_uin", "uint64_data_time", "uint32_user_show_flag", "uint32_sys_show_flag", "uint32_time_to_update", "bytes_owner_name", "bytes_admin_name", "uint32_seq", "uint32_office_mode", "uint32_level_name_seq", "uint32_user_show_flag_new", "rpt_msg_level_name_new"}, new Object[]{0L, null, null, 0L, 0L, 0, 0, 0, byteStringMicro, byteStringMicro, 0, 0, 0, 0, null}, RspBody.class); + } + + public RspBody() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.bytes_owner_name = PBField.initBytes(byteStringMicro); + this.bytes_admin_name = PBField.initBytes(byteStringMicro); + this.uint32_seq = PBField.initUInt32(0); + this.uint32_office_mode = PBField.initUInt32(0); + this.uint32_level_name_seq = PBField.initUInt32(0); + this.uint32_user_show_flag_new = PBField.initUInt32(0); + this.rpt_msg_level_name_new = PBField.initRepeatMessage(LevelName.class); + } + } + + public static final class LevelName extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18}, new String[]{"uint32_level", "str_name"}, new Object[]{0, ByteStringMicro.EMPTY}, LevelName.class); + public final PBUInt32Field uint32_level = PBField.initUInt32(0); + public final PBBytesField str_name = PBField.initBytes(ByteStringMicro.EMPTY); + } + + public static final class MemberLevelInfo extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_email; + public final PBBytesField bytes_group_honor; + public final PBBytesField bytes_job; + public final PBBytesField bytes_msg_need_field; + public final PBBytesField bytes_nick_name; + public final PBBytesField bytes_phone; + public final PBBytesField bytes_remark; + public final PBBytesField bytes_special_title; + public final PBBytesField str_name; + public final PBUInt32Field uint32_cmduin_flagex3_grocery; + public final PBUInt32Field uint32_gender; + public final PBUInt32Field uint32_glamour_level; + public final PBUInt32Field uint32_global_group_level; + public final PBUInt32Field uint32_global_group_point; + public final PBUInt32Field uint32_membership; + public final PBUInt32Field uint32_rich_card_name_ver; + public final PBUInt32Field uint32_ringtone_id; + public final PBUInt32Field uint32_special_title_expire_time; + public final PBUInt32Field uint32_title_id; + public final PBUInt32Field uint32_torchbearer_flag; + public final PBUInt64Field uint64_uin = PBField.initUInt64(0); + public final PBUInt32Field uint32_point = PBField.initUInt32(0); + public final PBUInt32Field uint32_active_day = PBField.initUInt32(0); + public final PBUInt32Field uint32_level = PBField.initUInt32(0); + + static { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 42, 50, 58, 64, 74, 82, 90, 96, 106, 112, 120, 128, 136, 144, 152, 160, 170, 176, 186, 192}, new String[]{"uint64_uin", "uint32_point", "uint32_active_day", "uint32_level", "str_name", "bytes_nick_name", "bytes_special_title", "uint32_special_title_expire_time", "bytes_phone", "bytes_email", "bytes_remark", "uint32_gender", "bytes_job", "uint32_glamour_level", "uint32_torchbearer_flag", "uint32_global_group_level", "uint32_title_id", "uint32_global_group_point", "uint32_rich_card_name_ver", "uint32_ringtone_id", "bytes_group_honor", "uint32_membership", "bytes_msg_need_field", "uint32_cmduin_flagex3_grocery"}, new Object[]{0L, 0, 0, 0, byteStringMicro, byteStringMicro, byteStringMicro, 0, byteStringMicro, byteStringMicro, byteStringMicro, 0, byteStringMicro, 0, 0, 0, 0, 0, 0, 0, byteStringMicro, 0, byteStringMicro, 0}, MemberLevelInfo.class); + } + + public MemberLevelInfo() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.str_name = PBField.initBytes(byteStringMicro); + this.bytes_nick_name = PBField.initBytes(byteStringMicro); + this.bytes_special_title = PBField.initBytes(byteStringMicro); + this.uint32_special_title_expire_time = PBField.initUInt32(0); + this.bytes_phone = PBField.initBytes(byteStringMicro); + this.bytes_email = PBField.initBytes(byteStringMicro); + this.bytes_remark = PBField.initBytes(byteStringMicro); + this.uint32_gender = PBField.initUInt32(0); + this.bytes_job = PBField.initBytes(byteStringMicro); + this.uint32_glamour_level = PBField.initUInt32(0); + this.uint32_torchbearer_flag = PBField.initUInt32(0); + this.uint32_global_group_level = PBField.initUInt32(0); + this.uint32_title_id = PBField.initUInt32(0); + this.uint32_global_group_point = PBField.initUInt32(0); + this.uint32_rich_card_name_ver = PBField.initUInt32(0); + this.uint32_ringtone_id = PBField.initUInt32(0); + this.bytes_group_honor = PBField.initBytes(byteStringMicro); + this.uint32_membership = PBField.initUInt32(0); + this.bytes_msg_need_field = PBField.initBytes(byteStringMicro); + this.uint32_cmduin_flagex3_grocery = PBField.initUInt32(0); + } + } +} diff --git a/qqinterface/src/main/java/tencent/im/oidb/cmd0x88d/oidb_0x88d.java b/qqinterface/src/main/java/tencent/im/oidb/cmd0x88d/oidb_0x88d.java new file mode 100644 index 0000000..460fc51 --- /dev/null +++ b/qqinterface/src/main/java/tencent/im/oidb/cmd0x88d/oidb_0x88d.java @@ -0,0 +1,269 @@ +package tencent.im.oidb.cmd0x88d; + +import com.tencent.mobileqq.pb.ByteStringMicro; +import com.tencent.mobileqq.pb.MessageMicro; +import com.tencent.mobileqq.pb.PBBytesField; +import com.tencent.mobileqq.pb.PBField; +import com.tencent.mobileqq.pb.PBInt64Field; +import com.tencent.mobileqq.pb.PBRepeatField; +import com.tencent.mobileqq.pb.PBRepeatMessageField; +import com.tencent.mobileqq.pb.PBUInt32Field; +import com.tencent.mobileqq.pb.PBUInt64Field; + +public class oidb_0x88d { + public static class RspBody extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{10, 18}, new String[]{"stzrspgroupinfo", "str_errorinfo"}, new Object[]{null, ByteStringMicro.EMPTY}, RspBody.class); + public final PBRepeatMessageField stzrspgroupinfo = PBField.initRepeatMessage(RspGroupInfo.class); + public final PBBytesField str_errorinfo = PBField.initBytes(ByteStringMicro.EMPTY); + } + + public static class RspGroupInfo extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 26}, new String[]{"uint64_group_code", "uint32_result", "stgroupinfo"}, new Object[]{0L, 0, null}, RspGroupInfo.class); + public final PBUInt64Field uint64_group_code = PBField.initUInt64(0); + public final PBUInt32Field uint32_result = PBField.initUInt32(0); + public GroupInfo stgroupinfo = new GroupInfo(); + } + + public static final class GroupGeoInfo extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 16, 24, 32, 40, 50, 56}, new String[]{"uint64_owneruin", "uint32_settime", "uint32_cityid", "int64_longitude", "int64_latitude", "bytes_geocontent", "uint64_poi_id"}, new Object[]{0L, 0, 0, 0L, 0L, ByteStringMicro.EMPTY, 0L}, GroupGeoInfo.class); + public final PBUInt64Field uint64_owneruin = PBField.initUInt64(0); + public final PBUInt32Field uint32_settime = PBField.initUInt32(0); + public final PBUInt32Field uint32_cityid = PBField.initUInt32(0); + public final PBInt64Field int64_longitude = PBField.initInt64(0); + public final PBInt64Field int64_latitude = PBField.initInt64(0); + public final PBBytesField bytes_geocontent = PBField.initBytes(ByteStringMicro.EMPTY); + public final PBUInt64Field uint64_poi_id = PBField.initUInt64(0); + } + + public static final class GroupHeadPortrait extends MessageMicro { + static final MessageMicro.FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[]{8, 18, 24, 32, 42}, new String[]{"uint32_pic_cnt", "rpt_msg_info", "uint32_default_id", "uint32_verifying_pic_cnt", "rpt_msg_verifyingpic_info"}, new Object[]{0, null, 0, 0, null}, GroupHeadPortrait.class); + public final PBUInt32Field uint32_pic_cnt = PBField.initUInt32(0); + // public final PBRepeatMessageField rpt_msg_info = PBField.initRepeatMessage(oidb_0x88d$GroupHeadPortraitInfo.class); + public final PBUInt32Field uint32_default_id = PBField.initUInt32(0); + public final PBUInt32Field uint32_verifying_pic_cnt = PBField.initUInt32(0); + //public final PBRepeatMessageField rpt_msg_verifyingpic_info = PBField.initRepeatMessage(oidb_0x88d$GroupHeadPortraitInfo.class); + } + + public static final class GroupInfo extends MessageMicro { + //static final MessageMicro.FieldMap __fieldMap__; + public final PBBytesField bytes_cmduin_group_remark_name; + public final PBBytesField bytes_group_school_info; + public final PBBytesField bytes_join_group_auth; + public GroupGeoInfo group_geo_info; + public GroupHeadPortrait msg_head_portrait; + //public final PBRepeatMessageField rpt_tag_record; + //public oidb_0x88d$GroupCardPrefix st_group_card_prefix; + //public oidb_0x88d$GroupExInfoOnly st_group_ex_info; + // public oidb_0xef0$GroupInfoExt st_group_info_ext; + public final PBBytesField string_certification_text; + public final PBBytesField string_group_aio_skin_url; + public final PBBytesField string_group_answer; + public final PBBytesField string_group_board_skin_url; + public final PBBytesField string_group_class_text; + public final PBBytesField string_group_cover_skin_url; + public final PBBytesField string_group_finger_memo; + public final PBBytesField string_group_memo; + public final PBBytesField string_group_name; + public final PBBytesField string_group_question; + public final PBBytesField string_group_rich_finger_memo; + public final PBBytesField string_long_group_name; + public final PBBytesField string_poid_info; + public final PBUInt32Field uint32_active_member_num; + public final PBUInt32Field uint32_app_privilege_flag; + public final PBUInt32Field uint32_appeal_deadline; + public final PBUInt32Field uint32_auto_agree_join_group_user_num_for_conf_group; + public final PBUInt32Field uint32_auto_agree_join_group_user_num_for_normal_group; + public final PBUInt32Field uint32_certification_type; + public final PBUInt32Field uint32_cmduin_flag_ex; + public final PBUInt32Field uint32_cmduin_flag_ex2; + public final PBUInt32Field uint32_cmduin_flag_ex3_grocery; + public final PBUInt32Field uint32_cmduin_history_msg_seq; + public final PBUInt32Field uint32_cmduin_join_msg_seq; + public final PBUInt32Field uint32_cmduin_join_real_msg_seq; + public final PBUInt32Field uint32_cmduin_join_time; + public final PBUInt32Field uint32_cmduin_last_msg_time; + public final PBUInt32Field uint32_cmduin_msg_seq; + public final PBUInt32Field uint32_cmduin_new_mobile_flag; + public final PBUInt32Field uint32_cmduin_privilege; + public final PBUInt32Field uint32_cmduin_read_msg_seq; + public final PBUInt32Field uint32_cmduin_ringtone_id; + public final PBUInt32Field uint32_cmduin_uin_flag; + public final PBUInt32Field uint32_conf_max_msg_seq; + public final PBUInt32Field uint32_conf_to_group_time; + public final PBUInt32Field uint32_create_source_flag; + public final PBUInt32Field uint32_group_admin_max_num; + public final PBUInt32Field uint32_group_aio_skin_timestamp; + public final PBRepeatField uint32_group_alliance_code; + public final PBUInt32Field uint32_group_board_skin_timestamp; + public final PBUInt32Field uint32_group_cover_skin_timestamp; + public final PBUInt32Field uint32_group_cur_msg_seq; + public final PBUInt32Field uint32_group_extra_adm_num; + public final PBUInt32Field uint32_group_flagext3; + public final PBUInt32Field uint32_group_flagext4; + public final PBUInt32Field uint32_group_freeze_reason; + public final PBUInt32Field uint32_group_grade; + public final PBUInt32Field uint32_group_info_ext_seq; + public final PBUInt32Field uint32_group_last_msg_time; + public final PBUInt32Field uint32_group_open_appid; + public final PBUInt32Field uint32_group_sec_level; + public final PBUInt32Field uint32_group_sec_level_info; + public final PBUInt32Field uint32_group_type_flag; + public final PBUInt32Field uint32_group_visitor_cur_num; + public final PBUInt32Field uint32_group_visitor_max_num; + public final PBUInt32Field uint32_head_portrait_seq; + public final PBUInt32Field uint32_hl_guild_appid; + public final PBUInt32Field uint32_hl_guild_orgid; + public final PBUInt32Field uint32_hl_guild_sub_type; + public final PBUInt32Field uint32_important_msg_latest_seq; + public final PBUInt32Field uint32_is_allow_conf_group_member_at_all; + public final PBUInt32Field uint32_is_allow_conf_group_member_modify_group_name; + public final PBUInt32Field uint32_is_allow_conf_group_member_nick; + public final PBUInt32Field uint32_is_allow_hl_guild_binary; + public final PBUInt32Field uint32_is_allow_recall_msg; + public final PBUInt32Field uint32_is_conf_group; + public final PBUInt32Field uint32_is_group_freeze; + public final PBUInt32Field uint32_is_modify_conf_group_face; + public final PBUInt32Field uint32_is_modify_conf_group_name; + public final PBUInt32Field uint32_level_name_seq; + public final PBUInt32Field uint32_member_list_change_seq; + public final PBUInt32Field uint32_membercard_seq; + public final PBUInt32Field uint32_msg_limit_frequency; + public final PBUInt32Field uint32_no_code_finger_open_flag; + public final PBUInt32Field uint32_no_finger_open_flag; + public final PBUInt32Field uint32_password_redbag_time; + public final PBUInt32Field uint32_shutup_timestamp_me; + public final PBUInt32Field uint32_team_seq; + public final PBUInt64Field uint64_alliance_id; + public final PBUInt64Field uint64_conf_uin; + public final PBUInt64Field uint64_group_uin; + public final PBUInt64Field uint64_history_msg_begin_time; + public final PBUInt64Field uint64_invite_no_auth_num_limit; + public final PBUInt64Field uint64_parent_id; + public final PBUInt64Field uint64_root_id; + public final PBUInt64Field uint64_shutup_timestamp; + public final PBUInt64Field uint64_subscription_uin; + public final PBUInt64Field uint64_group_owner = PBField.initUInt64(0); + public final PBUInt32Field uint32_group_create_time = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_flag = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_flag_ext = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_member_max_num = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_member_num = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_option = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_class_ext = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_special_class = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_level = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_face = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_default_page = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_info_seq = PBField.initUInt32(0); + public final PBUInt32Field uint32_group_roaming_time = PBField.initUInt32(0); + + static { + //ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + //__fieldMap__ = MessageMicro.initFieldMap( + // new int[]{8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 122, 130, 138, 146, 152, 160, 168, 176, 184, 194, 202, 208, 216, 224, 232, 240, 248, 258, 266, 272, + // FilterEnum.MIC_PTU_BAIXI, FilterEnum.MIC_PTU_YOUJIALI, 296, 304, 314, 322, MapItemKt.ITEM_AVATAR_MIN_WIDTH, 338, 344, g.CTRL_INDEX, 360, 368, 376, MsgConstant.KRMFILETHUMBSIZE384, QFSBottomDynamicGuideEvent.DYNAMIC_GUIDE_BUTTON_TYPE, 400, 408, 416, 424, 432, 440, TroopInfo.PAY_PRIVILEGE_ALL, 458, 464, e.CTRL_INDEX, 480, P2VGlobalConfig.WATER_MARKER_WIDTH, w.CTRL_INDEX, 504, 512, TVKPlayerWrapperMsg.PLAYER_INFO_CGI_REQUEST, 528, 536, 544, 552, PlayerResources.ViewId.GET_MORE_TOGGLE_AREA, PlayerResources.ViewId.EXTENDED_VIEW_BTN_NORMAL_BUTTON, PlayerResources.ViewId.CANVAS_VIDEO_TOTAL_TRAFFIC_TEXT, 584, d.CTRL_INDEX, 600, 608, 616, 624, 632, 640, 648, 656, LpReportInfoConfig.ACTION_VIDEO_EDITOR, 672, 680, 688, 696, 704, 714, 720, 728, b.CTRL_INDEX, 746, com.tencent.luggage.wxa.sa.e.N, 760, 768, 776, 784, l.CTRL_INDEX, 800, SharedExtProcessor.CONFIG_ID, 816, BusinessInfoCheckUpdateItem.UIAPPID_XINGQU_BULUO, 832, h.CTRL_INDEX, TVKCodecUtils.HD_WIDTH, 856, 864, 874, 882}, new String[]{ + // + // "uint64_group_owner", "uint32_group_create_time", "uint32_group_flag", "uint32_group_flag_ext", "uint32_group_member_max_num", "uint32_group_member_num", "uint32_group_option", "uint32_group_class_ext", "uint32_group_special_class", "uint32_group_level", "uint32_group_face", "uint32_group_default_page", "uint32_group_info_seq", "uint32_group_roaming_time", "string_group_name", "string_group_memo", "string_group_finger_memo", "string_group_class_text", "uint32_group_alliance_code", "uint32_group_extra_adm_num", "uint64_group_uin", "uint32_group_cur_msg_seq", "uint32_group_last_msg_time", "string_group_question", "string_group_answer", "uint32_group_visitor_max_num", "uint32_group_visitor_cur_num", "uint32_level_name_seq", "uint32_group_admin_max_num", "uint32_group_aio_skin_timestamp", "uint32_group_board_skin_timestamp", "string_group_aio_skin_url", "string_group_board_skin_url", "uint32_group_cover_skin_timestamp", "string_group_cover_skin_url", "uint32_group_grade", "uint32_active_member_num", "uint32_certification_type", "string_certification_text", "string_group_rich_finger_memo", "rpt_tag_record", "group_geo_info", "uint32_head_portrait_seq", "msg_head_portrait", "uint64_shutup_timestamp", "uint32_shutup_timestamp_me", "uint32_create_source_flag", "uint32_cmduin_msg_seq", "uint32_cmduin_join_time", "uint32_cmduin_uin_flag", "uint32_cmduin_flag_ex", "uint32_cmduin_new_mobile_flag", "uint32_cmduin_read_msg_seq", "uint32_cmduin_last_msg_time", "uint32_group_type_flag", "uint32_app_privilege_flag", "st_group_ex_info", "uint32_group_sec_level", "uint32_group_sec_level_info", "uint32_cmduin_privilege", "string_poid_info", "uint32_cmduin_flag_ex2", "uint64_conf_uin", "uint32_conf_max_msg_seq", "uint32_conf_to_group_time", "uint32_password_redbag_time", "uint64_subscription_uin", "uint32_member_list_change_seq", "uint32_membercard_seq", "uint64_root_id", "uint64_parent_id", "uint32_team_seq", "uint64_history_msg_begin_time", "uint64_invite_no_auth_num_limit", "uint32_cmduin_history_msg_seq", "uint32_cmduin_join_msg_seq", "uint32_group_flagext3", "uint32_group_open_appid", "uint32_is_conf_group", "uint32_is_modify_conf_group_face", "uint32_is_modify_conf_group_name", "uint32_no_finger_open_flag", "uint32_no_code_finger_open_flag", "uint32_auto_agree_join_group_user_num_for_normal_group", "uint32_auto_agree_join_group_user_num_for_conf_group", "uint32_is_allow_conf_group_member_nick", "uint32_is_allow_conf_group_member_at_all", "uint32_is_allow_conf_group_member_modify_group_name", "string_long_group_name", "uint32_cmduin_join_real_msg_seq", "uint32_is_group_freeze", "uint32_msg_limit_frequency", "bytes_join_group_auth", "uint32_hl_guild_appid", "uint32_hl_guild_sub_type", "uint32_hl_guild_orgid", "uint32_is_allow_hl_guild_binary", "uint32_cmduin_ringtone_id", "uint32_group_flagext4", "uint32_group_freeze_reason", "uint32_is_allow_recall_msg", "uint32_important_msg_latest_seq", "bytes_group_school_info", "uint32_appeal_deadline", "st_group_card_prefix", "uint64_alliance_id", "uint32_cmduin_flag_ex3_grocery", "uint32_group_info_ext_seq", "st_group_info_ext", "bytes_cmduin_group_remark_name"}, new Object[]{0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, 0, 0, 0L, 0, 0, byteStringMicro, byteStringMicro, 0, 0, 0, 0, 0, 0, byteStringMicro, byteStringMicro, 0, byteStringMicro, 0, 0, 0, byteStringMicro, byteStringMicro, null, null, 0, null, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, null, 0, 0, 0, byteStringMicro, 0, 0L, 0, 0, 0, 0L, 0, 0, 0L, 0L, 0, 0L, 0L, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, byteStringMicro, 0, 0, 0, byteStringMicro, 0, 0, 0, 0, 0, 0, 0, 0, 0, byteStringMicro, 0, null, 0L, 0, 0, null, byteStringMicro}, oidb_0x88d$GroupInfo.class); + } + + public GroupInfo() { + ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY; + this.string_group_name = PBField.initBytes(byteStringMicro); + this.string_group_memo = PBField.initBytes(byteStringMicro); + this.string_group_finger_memo = PBField.initBytes(byteStringMicro); + this.string_group_class_text = PBField.initBytes(byteStringMicro); + this.uint32_group_alliance_code = PBField.initRepeat(PBUInt32Field.__repeatHelper__); + this.uint32_group_extra_adm_num = PBField.initUInt32(0); + this.uint64_group_uin = PBField.initUInt64(0L); + this.uint32_group_cur_msg_seq = PBField.initUInt32(0); + this.uint32_group_last_msg_time = PBField.initUInt32(0); + this.string_group_question = PBField.initBytes(byteStringMicro); + this.string_group_answer = PBField.initBytes(byteStringMicro); + this.uint32_group_visitor_max_num = PBField.initUInt32(0); + this.uint32_group_visitor_cur_num = PBField.initUInt32(0); + this.uint32_level_name_seq = PBField.initUInt32(0); + this.uint32_group_admin_max_num = PBField.initUInt32(0); + this.uint32_group_aio_skin_timestamp = PBField.initUInt32(0); + this.uint32_group_board_skin_timestamp = PBField.initUInt32(0); + this.string_group_aio_skin_url = PBField.initBytes(byteStringMicro); + this.string_group_board_skin_url = PBField.initBytes(byteStringMicro); + this.uint32_group_cover_skin_timestamp = PBField.initUInt32(0); + this.string_group_cover_skin_url = PBField.initBytes(byteStringMicro); + this.uint32_group_grade = PBField.initUInt32(0); + this.uint32_active_member_num = PBField.initUInt32(0); + this.uint32_certification_type = PBField.initUInt32(0); + this.string_certification_text = PBField.initBytes(byteStringMicro); + this.string_group_rich_finger_memo = PBField.initBytes(byteStringMicro); + // this.rpt_tag_record = PBField.initRepeatMessage(oidb_0x88d$TagRecord.class); + this.group_geo_info = new GroupGeoInfo(); + this.uint32_head_portrait_seq = PBField.initUInt32(0); + this.msg_head_portrait = new GroupHeadPortrait(); + this.uint64_shutup_timestamp = PBField.initUInt64(0L); + this.uint32_shutup_timestamp_me = PBField.initUInt32(0); + this.uint32_create_source_flag = PBField.initUInt32(0); + this.uint32_cmduin_msg_seq = PBField.initUInt32(0); + this.uint32_cmduin_join_time = PBField.initUInt32(0); + this.uint32_cmduin_uin_flag = PBField.initUInt32(0); + this.uint32_cmduin_flag_ex = PBField.initUInt32(0); + this.uint32_cmduin_new_mobile_flag = PBField.initUInt32(0); + this.uint32_cmduin_read_msg_seq = PBField.initUInt32(0); + this.uint32_cmduin_last_msg_time = PBField.initUInt32(0); + this.uint32_group_type_flag = PBField.initUInt32(0); + this.uint32_app_privilege_flag = PBField.initUInt32(0); + // this.st_group_ex_info = new oidb_0x88d$GroupExInfoOnly(); + this.uint32_group_sec_level = PBField.initUInt32(0); + this.uint32_group_sec_level_info = PBField.initUInt32(0); + this.uint32_cmduin_privilege = PBField.initUInt32(0); + this.string_poid_info = PBField.initBytes(byteStringMicro); + this.uint32_cmduin_flag_ex2 = PBField.initUInt32(0); + this.uint64_conf_uin = PBField.initUInt64(0L); + this.uint32_conf_max_msg_seq = PBField.initUInt32(0); + this.uint32_conf_to_group_time = PBField.initUInt32(0); + this.uint32_password_redbag_time = PBField.initUInt32(0); + this.uint64_subscription_uin = PBField.initUInt64(0L); + this.uint32_member_list_change_seq = PBField.initUInt32(0); + this.uint32_membercard_seq = PBField.initUInt32(0); + this.uint64_root_id = PBField.initUInt64(0L); + this.uint64_parent_id = PBField.initUInt64(0L); + this.uint32_team_seq = PBField.initUInt32(0); + this.uint64_history_msg_begin_time = PBField.initUInt64(0L); + this.uint64_invite_no_auth_num_limit = PBField.initUInt64(0L); + this.uint32_cmduin_history_msg_seq = PBField.initUInt32(0); + this.uint32_cmduin_join_msg_seq = PBField.initUInt32(0); + this.uint32_group_flagext3 = PBField.initUInt32(0); + this.uint32_group_open_appid = PBField.initUInt32(0); + this.uint32_is_conf_group = PBField.initUInt32(0); + this.uint32_is_modify_conf_group_face = PBField.initUInt32(0); + this.uint32_is_modify_conf_group_name = PBField.initUInt32(0); + this.uint32_no_finger_open_flag = PBField.initUInt32(0); + this.uint32_no_code_finger_open_flag = PBField.initUInt32(0); + this.uint32_auto_agree_join_group_user_num_for_normal_group = PBField.initUInt32(0); + this.uint32_auto_agree_join_group_user_num_for_conf_group = PBField.initUInt32(0); + this.uint32_is_allow_conf_group_member_nick = PBField.initUInt32(0); + this.uint32_is_allow_conf_group_member_at_all = PBField.initUInt32(0); + this.uint32_is_allow_conf_group_member_modify_group_name = PBField.initUInt32(0); + this.string_long_group_name = PBField.initBytes(byteStringMicro); + this.uint32_cmduin_join_real_msg_seq = PBField.initUInt32(0); + this.uint32_is_group_freeze = PBField.initUInt32(0); + this.uint32_msg_limit_frequency = PBField.initUInt32(0); + this.bytes_join_group_auth = PBField.initBytes(byteStringMicro); + this.uint32_hl_guild_appid = PBField.initUInt32(0); + this.uint32_hl_guild_sub_type = PBField.initUInt32(0); + this.uint32_hl_guild_orgid = PBField.initUInt32(0); + this.uint32_is_allow_hl_guild_binary = PBField.initUInt32(0); + this.uint32_cmduin_ringtone_id = PBField.initUInt32(0); + this.uint32_group_flagext4 = PBField.initUInt32(0); + this.uint32_group_freeze_reason = PBField.initUInt32(0); + this.uint32_is_allow_recall_msg = PBField.initUInt32(0); + this.uint32_important_msg_latest_seq = PBField.initUInt32(0); + this.bytes_group_school_info = PBField.initBytes(byteStringMicro); + this.uint32_appeal_deadline = PBField.initUInt32(0); + // this.st_group_card_prefix = new oidb_0x88d$GroupCardPrefix(); + this.uint64_alliance_id = PBField.initUInt64(0L); + this.uint32_cmduin_flag_ex3_grocery = PBField.initUInt32(0); + this.uint32_group_info_ext_seq = PBField.initUInt32(0); + // this.st_group_info_ext = new oidb_0xef0$GroupInfoExt(); + this.bytes_cmduin_group_remark_name = PBField.initBytes(byteStringMicro); + } + } +} diff --git a/xposed/src/main/cpp/clover.cpp b/xposed/src/main/cpp/clover.cpp index 6957055..def0f8f 100644 --- a/xposed/src/main/cpp/clover.cpp +++ b/xposed/src/main/cpp/clover.cpp @@ -138,12 +138,6 @@ char * __cdecl my_strstr(const char *lhs, const char *rhs) { } int fake_memcmp(const void* __lhs, const void* __rhs, size_t __n) { - //if (my_strstr((const char*) __rhs, "lsposed")) { - //return -1; - //} - //if (my_strstr((const char*) __rhs, "xposed")) { - // return -1; - //} if (my_strstr((const char*) __rhs, "shamrock")) { if (backup_memcmp(__lhs, __rhs, __n) == 0) { // 底层广播判断 @@ -151,13 +145,7 @@ int fake_memcmp(const void* __lhs, const void* __rhs, size_t __n) { } return -1; } - if (my_strstr((const char*) __rhs, "riru")) { - return -1; - } - //if (my_strstr((const char*) __rhs, "zygisk")) { - // return -1; - //} - //if (my_strstr((const char*) __rhs, "magisk")) { + //if (my_strstr((const char*) __rhs, "riru") && my_strstr((const char*) __lhs, "riru")) { // return -1; //} return backup_memcmp(__lhs, __rhs, __n); diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt index 6efa17a..51555dd 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/BaseSvc.kt @@ -121,6 +121,24 @@ internal abstract class BaseSvc { app.sendToService(toServiceMsg) } + protected suspend fun sendAW(toServiceMsg: ToServiceMsg, timeout: Long = 5000L): ByteArray? { + val seq = MsfCore.getNextSeq() + return withTimeoutOrNull(timeout) { + suspendCancellableCoroutine { continuation -> + GlobalScope.launch(Dispatchers.Default) { + DynamicReceiver.register(IPCRequest(toServiceMsg.serviceCmd, seq) { + val buffer = it.getByteArrayExtra("buffer")!! + continuation.resume(buffer) + }) + toServiceMsg.addAttribute("shamrock_seq", seq) + send(toServiceMsg) + } + } + }.also { + if (it == null) DynamicReceiver.unregister(seq) + }?.copyOf() + } + protected fun sendExtra(cmd: String, builder: (Bundle) -> Unit) { val toServiceMsg = createToServiceMsg(cmd) builder(toServiceMsg.extraData) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt index 2b5b6f7..d65c928 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/FileSvc.kt @@ -2,7 +2,7 @@ package moe.fuqiuluo.qqinterface.servlet import com.tencent.mobileqq.pb.ByteStringMicro import moe.fuqiuluo.proto.protobufOf -import moe.fuqiuluo.qqinterface.servlet.entries.* +import moe.fuqiuluo.qqinterface.servlet.structures.* import moe.fuqiuluo.qqinterface.servlet.transfile.RichProtoSvc import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt index 2ab97f7..f6c21e1 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/GroupSvc.kt @@ -2,7 +2,9 @@ package moe.fuqiuluo.qqinterface.servlet +import KQQ.RespBatchProcess import androidx.core.text.HtmlCompat +import com.qq.jce.wup.UniPacket import com.tencent.common.app.AppInterface import com.tencent.mobileqq.app.BusinessHandlerFactory import com.tencent.mobileqq.app.QQAppInterface @@ -12,6 +14,7 @@ import com.tencent.mobileqq.pb.ByteStringMicro import com.tencent.mobileqq.troop.api.ITroopInfoService import com.tencent.mobileqq.troop.api.ITroopMemberInfoService import com.tencent.protofile.join_group_link.join_group_link +import com.tencent.qphone.base.remote.FromServiceMsg import com.tencent.qphone.base.remote.ToServiceMsg import com.tencent.qqnt.kernel.nativeinterface.MemberInfo import com.tencent.qqnt.kernel.nativeinterface.MsgConstant @@ -49,8 +52,9 @@ import moe.fuqiuluo.proto.asUtf8String import moe.fuqiuluo.proto.protobufOf import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getLongUin import moe.fuqiuluo.qqinterface.servlet.TicketSvc.getUin -import moe.fuqiuluo.qqinterface.servlet.entries.GroupAtAllRemainInfo -import moe.fuqiuluo.qqinterface.servlet.entries.ProhibitedMemberInfo +import moe.fuqiuluo.qqinterface.servlet.structures.GroupAtAllRemainInfo +import moe.fuqiuluo.qqinterface.servlet.structures.NotJoinedGroupInfo +import moe.fuqiuluo.qqinterface.servlet.structures.ProhibitedMemberInfo import moe.fuqiuluo.shamrock.helper.Level import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.MessageHelper @@ -75,6 +79,7 @@ import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import moe.fuqiuluo.shamrock.xposed.helper.NTServiceFetcher import mqq.app.MobileQQ import tencent.im.group.group_member_info +import tencent.im.oidb.cmd0x88d.oidb_0x88d import tencent.im.oidb.cmd0x899.oidb_0x899 import tencent.im.oidb.cmd0x89a.oidb_0x89a import tencent.im.oidb.cmd0x8a0.oidb_0x8a0 @@ -87,10 +92,11 @@ import java.lang.reflect.Method import java.lang.reflect.Modifier import java.nio.ByteBuffer import kotlin.coroutines.resume -import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` as ReqSystemMsgNew import tencent.mobileim.structmsg.`structmsg$FlagInfo` as FlagInfo +import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew` as ReqSystemMsgNew import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew` as RspSystemMsgNew import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg + internal object GroupSvc: BaseSvc() { private val RefreshTroopMemberInfoLock by lazy { Mutex() @@ -188,6 +194,36 @@ internal object GroupSvc: BaseSvc() { return Result.success(troopList) } + suspend fun getNotJoinedGroupInfo(groupId: Long): Result { + return withTimeoutOrNull(5000) timeout@{ + val toServiceMsg = createToServiceMsg("ProfileService.ReqBatchProcess") + toServiceMsg.extraData.putLong("troop_code", groupId) + toServiceMsg.extraData.putBoolean("is_admin", false) + toServiceMsg.extraData.putInt("from", 0) + val buffer = sendAW(toServiceMsg) + val uniPacket = UniPacket(true) + uniPacket.encodeName = "utf-8" + uniPacket.decode(buffer) + val respBatchProcess = uniPacket.getByClass("RespBatchProcess", RespBatchProcess()) + val batchRespInfo = oidb_0x88d.RspBody().mergeFrom(oidb_sso.OIDBSSOPkg() + .mergeFrom(respBatchProcess.batch_response_list.first().buffer) + .bytes_bodybuffer.get().toByteArray()).stzrspgroupinfo.get().firstOrNull() + ?: return@timeout Result.failure(Exception("获取群信息失败")) + val info = batchRespInfo.stgroupinfo + Result.success(NotJoinedGroupInfo( + groupId = batchRespInfo.uint64_group_code.get(), + maxMember = info.uint32_group_member_max_num.get(), + memberCount = info.uint32_group_member_num.get(), + groupName = info.string_group_name.get().toStringUtf8(), + groupDesc = info.string_group_finger_memo.get().toStringUtf8(), + owner = info.uint64_group_owner.get(), + createTime = info.uint32_group_create_time.get().toLong(), + groupFlag = info.uint32_group_flag.get(), + groupFlagExt = info.uint32_group_flag_ext.get() + )) + } ?: Result.failure(Exception("获取群信息超时")) + } + suspend fun getGroupInfo(groupId: String, refresh: Boolean): Result { val service = app .getRuntimeService(ITroopInfoService::class.java, "all") @@ -655,7 +691,7 @@ internal object GroupSvc: BaseSvc() { private suspend fun requestGroupInfo(dataService: ITroopInfoService, uin: Long): Result { val strUin = uin.toString() - val info = withTimeoutOrNull(5000) { + val info = withTimeoutOrNull(1000) { var troopInfo: TroopInfo? do { troopInfo = dataService.getTroopInfo(strUin) diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/GroupEntries.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/GroupEntries.kt deleted file mode 100644 index 4ce1a6a..0000000 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/GroupEntries.kt +++ /dev/null @@ -1,17 +0,0 @@ -package moe.fuqiuluo.qqinterface.servlet.entries - -import kotlinx.serialization.SerialName -import kotlinx.serialization.Serializable - -@Serializable -internal data class ProhibitedMemberInfo( - @SerialName("user_id") val memberUin: Long, - @SerialName("time") val shutuptimestap: Int -) - -@Serializable -internal data class GroupAtAllRemainInfo( - @SerialName("can_at_all") val canAtAll: Boolean, - @SerialName("remain_at_all_count_for_group") val remainAtAllCountForGroup: Int, - @SerialName("remain_at_all_count_for_uin") val remainAtAllCountForUin: Int -) \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/Files.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Files.kt similarity index 97% rename from xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/Files.kt rename to xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Files.kt index de7d414..8c3eb36 100644 --- a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/entries/Files.kt +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Files.kt @@ -1,4 +1,4 @@ -package moe.fuqiuluo.qqinterface.servlet.entries +package moe.fuqiuluo.qqinterface.servlet.structures import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable diff --git a/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Group.kt b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Group.kt new file mode 100644 index 0000000..83b18b7 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/qqinterface/servlet/structures/Group.kt @@ -0,0 +1,30 @@ +package moe.fuqiuluo.qqinterface.servlet.structures + +import kotlinx.serialization.SerialName +import kotlinx.serialization.Serializable + +@Serializable +internal data class ProhibitedMemberInfo( + @SerialName("user_id") val memberUin: Long, + @SerialName("time") val shutuptimestap: Int +) + +@Serializable +internal data class GroupAtAllRemainInfo( + @SerialName("can_at_all") val canAtAll: Boolean, + @SerialName("remain_at_all_count_for_group") val remainAtAllCountForGroup: Int, + @SerialName("remain_at_all_count_for_uin") val remainAtAllCountForUin: Int +) + +@Serializable +internal data class NotJoinedGroupInfo( + @SerialName("group_id") val groupId: Long, + @SerialName("max_member_cnt") val maxMember: Int, + @SerialName("member_count") val memberCount: Int, + @SerialName("group_name") val groupName: String, + @SerialName("group_desc") val groupDesc: String, + @SerialName("owner") val owner: Long, + @SerialName("create_time") val createTime: Long, + @SerialName("group_flag") val groupFlag: Int, + @SerialName("group_flag_ext") val groupFlagExt: Int, +) \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt index 97a087a..ddb5a78 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/ActionManager.kt @@ -26,7 +26,7 @@ internal object ActionManager { GetModelShowList, GetOnlineClients, GetStrangerInfo, IsBlackListUin, GetHttpCookies, GetFriendSystemMsg, // GroupInfo - GetTroopList, GetTroopInfo, GetTroopList, GetTroopMemberInfo, GetTroopMemberList, + GetTroopList, GetTroopInfo, GetTroopList, GetTroopMemberInfo, GetTroopMemberList, GetNotJoinedGroupInfo, // GroupActions ModifyTroopName, LeaveTroop, KickTroopMember, BanTroopMember, SetGroupWholeBan, SetGroupAdmin, diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt new file mode 100644 index 0000000..9506081 --- /dev/null +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/action/handlers/GetNotJoinedGroupInfo.kt @@ -0,0 +1,25 @@ +package moe.fuqiuluo.shamrock.remote.action.handlers + +import kotlinx.serialization.json.JsonElement +import moe.fuqiuluo.qqinterface.servlet.GroupSvc +import moe.fuqiuluo.shamrock.remote.action.ActionSession +import moe.fuqiuluo.shamrock.remote.action.IActionHandler +import moe.fuqiuluo.shamrock.tools.EmptyJsonString + +internal object GetNotJoinedGroupInfo: IActionHandler() { + override suspend fun internalHandle(session: ActionSession): String { + val groupId = session.getString("group_id") + return invoke(groupId, session.echo) + } + + suspend operator fun invoke(groupId: String, echo: JsonElement = EmptyJsonString): String { + GroupSvc.getNotJoinedGroupInfo(groupId = groupId.toLong()).onSuccess { + return ok(it, echo = echo) + }.exceptionOrNull()?.let { + return error(it.message ?: "无法获取群信息", echo = echo) + } + return logic("Unable to obtain group information", echo) + } + + override fun path(): String = "get_not_joined_group_info" +} \ No newline at end of file diff --git a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt index d393260..23fbd7d 100644 --- a/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt +++ b/xposed/src/main/java/moe/fuqiuluo/shamrock/remote/api/GroupAction.kt @@ -14,6 +14,11 @@ import moe.fuqiuluo.shamrock.tools.fetchOrThrow import moe.fuqiuluo.shamrock.tools.getOrPost fun Routing.troopAction() { + getOrPost("/get_not_joined_group_info") { + val groupId = fetchOrThrow("group_id") + call.respondText(GetNotJoinedGroupInfo(groupId), ContentType.Application.Json) + } + getOrPost("/get_prohibited_member_list") { val groupId = fetchOrThrow("group_id").toLong() call.respondText(GetProhibitedMemberList(groupId), ContentType.Application.Json)