Shamrock: 友人およびグループのメンバーシップ要求の処理

This commit is contained in:
ikechan8370 2023-11-21 23:39:20 +08:00
parent 040b132836
commit 3e27c64e84
31 changed files with 1263 additions and 10 deletions

View File

@ -0,0 +1,186 @@
package com.tencent.mobileqq.relation.api;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.TextView;
import com.tencent.common.app.AppInterface;
import com.tencent.mobileqq.data.MessageRecord;
import com.tencent.mobileqq.data.PhoneContact;
import com.tencent.mobileqq.qroute.QRouteApi;
import java.util.ArrayList;
import java.util.HashMap;
import tencent.mobileim.structmsg.*;
public interface IAddFriendTempApi extends QRouteApi {
public static final int ENTER_FROM_CONTACT_TAB = 1;
public static final int ENTER_FROM_DEFAULT = 0;
public static final int ENTER_FROM_MESSAGE_TAB = 2;
public static final int ENTER_FROM_NEW_FRIEND = 3;
public static final int ENTER_FROM_NEW_FRIEND_MORE = 4;
// void addBatchQIMFriends(List<QIMNotifyAddFriend> paramList, AppInterface paramAppInterface);
void addFriendToFriendList(AppInterface paramAppInterface, String paramString1, int paramInt1, int paramInt2, String paramString2, boolean paramBoolean1, boolean paramBoolean2, long paramLong);
void addListener(Object paramObject, AppInterface paramAppInterface);
void cancelMayKnowRecommend(String paramString, AppInterface paramAppInterface);
// void changeStructMsgActions(structmsg.StructMsg paramStructMsg, int paramInt1, String paramString, int paramInt2);
// boolean changeStructMsgActionsWhenFail(structmsg.StructMsg paramStructMsg, int paramInt, String paramString1, String paramString2);
void checkReadContactPermission(Runnable paramRunnable, AppInterface paramAppInterface);
void checkUpdate(AppInterface paramAppInterface, String paramString);
void clearAllSystemMsg(AppInterface paramAppInterface);
void clickQIMSource(Context paramContext, MessageRecord paramMessageRecord, AppInterface paramAppInterface);
Intent composeReturnIntent(Class<?> paramClass, String paramString, Activity paramActivity);
void deleteAllSuspiciousMsg(AppInterface paramAppInterface);
// void deleteQIMNotifyAddFriendData(QIMNotifyAddFriend paramQIMNotifyAddFriend, AppInterface paramAppInterface);
boolean enableCheckPermission();
void followUser(String paramString, boolean paramBoolean);
Intent getAddRequestIntent(Context paramContext);
Intent getBindNumberIntent(Context paramContext);
Intent getChatActivityIntent(Context paramContext);
// ArrayList<MayKnowRecommend> getConnectionsPersonLocal(int paramInt, AppInterface paramAppInterface);
void getConnectionsPersonRemoteNextPage(int paramInt, AppInterface paramAppInterface);
// ArrayList<a> getConnectionsTabInfoListLocal(AppInterface paramAppInterface);
void getDiscussInfo(long paramLong, AppInterface paramAppInterface);
String getDiscussionNameCanNull(AppInterface paramAppInterface, String paramString);
int getForwardSelectionRequest();
Intent getFriendProfileMoreInfoIntent(Context paramContext);
int getMayKnowLoadConnectionBizTypeFirstLoad();
int getMayKnowPersonNum(AppInterface paramAppInterface);
boolean getMayKnowRecommendRemoteFromNewFrd(AppInterface paramAppInterface);
String getQIMNewFriendSource(AppInterface paramAppInterface);
// ArrayList<s> getQIMNotifyAddFriendsMsg(boolean paramBoolean, AppInterface paramAppInterface);
String getQQInfoFromQQUin(long paramLong1, long paramLong2, AppInterface paramAppInterface);
HashMap<String, String> getQidianExternal(HashMap<String, Object> paramHashMap);
// String getRecommendLabelString(List<MayKnowRecommend.MayKnowRecommendLabel> paramList);
int getRequestForSetting();
int getSizeSmall();
void getSuspiciousFriendsUnreadNum(AppInterface paramAppInterface);
int getTypeSetConnectionsSwitch();
Object getValue(String paramString1, String paramString2, int paramInt1, int paramInt2);
void gotoFriendSettingBrowser(Context paramContext);
boolean hasQidianExternal(HashMap<String, Object> paramHashMap);
boolean hasQimSource(AppInterface paramAppInterface);
void insertCommonHobbyIfNeeded(AppInterface paramAppInterface, String paramString);
boolean isMayKnowConnectionsUserClosed(AppInterface paramAppInterface);
boolean isNewFrdMiniCardSwitchOn(AppInterface paramAppInterface);
boolean isPhoneContactEnabled(AppInterface paramAppInterface);
boolean isQidianMaster(AppInterface paramAppInterface, String paramString);
boolean isStudyMode(AppInterface paramAppInterface);
boolean isSuspiciousSwitchOpen();
// void jumpToMoveGroup(Activity paramActivity, QBaseFragment paramQBaseFragment, String paramString, int paramInt1, int paramInt2);
void jumpToNewFriendMoreSysMsgSuspiciousFragment(Context paramContext);
void jumpToNewFriendMoreSysMsgSuspiciousFragment(Context paramContext, Intent paramIntent, int paramInt);
void jumpToQidianProfile(String paramString, Activity paramActivity);
void jumpToSplash(Activity paramActivity);
void launchPluginBroadcastWhenToggleSwitch(String paramString, AppInterface paramAppInterface, boolean paramBoolean);
void loadConnectionsTabData(AppInterface paramAppInterface, int paramInt1, int paramInt2);
void markQIMNotifyAddFriendsRead(AppInterface paramAppInterface);
// void openSecCheckWebForFragment(AppInterface paramAppInterface, Context paramContext, QBaseFragment paramQBaseFragment, int paramInt, String paramString1, String paramString2);
// void recordStartExpose(MayKnowRecommend paramMayKnowRecommend, int paramInt1, int paramInt2, int paramInt3, AppInterface paramAppInterface);
// void recordStopExpose(MayKnowRecommend paramMayKnowRecommend, int paramInt1, int paramInt2, int paramInt3, AppInterface paramAppInterface);
void removeListener(Object paramObject, AppInterface paramAppInterface);
void reportExtendFriend(int paramInt, String paramString, Intent paramIntent);
void reportRecommend(AppInterface paramAppInterface, String paramString1, String paramString2, int paramInt1, int paramInt2, String paramString3, int paramInt3, byte[] paramArrayOfbyte, String paramString4, int paramInt4);
void reportRecommendExpose(AppInterface paramAppInterface, int paramInt1, ArrayList<String> paramArrayList1, ArrayList<String> paramArrayList2, ArrayList<Integer> paramArrayList, ArrayList<byte[]> paramArrayList3, int paramInt2);
void sendAddFriendNoticeForBaby(AppInterface paramAppInterface, Intent paramIntent);
// void sendDelSingleSystemMsg(structmsg.StructMsg paramStructMsg, String paramString, int paramInt, long paramLong, AppInterface paramAppInterface);
void sendFriendSystemMsgAction(int msg_type, long msg_seq, long req_uin, int sub_type, int src_id, int sub_src_id, int group_msg_type, structmsg$SystemMsgActionInfo action_info, int system_msg_action_type, structmsg$StructMsg paramStructMsg, boolean isUncommonlyUsedFrd, AppInterface paramAppInterface);
void sendFriendSystemMsgReadedReport(AppInterface paramAppInterface);
void sendGetNextFriendSystemMsg(AppInterface paramAppInterface);
void sendPokeMsg(AppInterface paramAppInterface, Context paramContext, String paramString);
void setConnectionsSwitch(boolean paramBoolean, AppInterface paramAppInterface);
boolean shouldShowMayKnowInNewFriend(AppInterface paramAppInterface);
// void startAddContactsPage(Context paramContext, int paramInt1, int paramInt2, LaunchMode paramLaunchMode, @Nullable Bundle paramBundle);
void startAddContactsPageForResult(Activity paramActivity, int paramInt1, int paramInt2, int paramInt3);
void startAddRequestPage(Context paramContext, Intent paramIntent);
void startAddRequestPageForResult(Activity paramActivity, Intent paramIntent, int paramInt);
void startAddRequestSuspiciousPage(Context paramContext, Intent paramIntent);
void startContactBindFromOther(AppInterface paramAppInterface, int paramInt1, int paramInt2, Intent paramIntent);
void startContactBindFromOther(AppInterface paramAppInterface, int paramInt, ArrayList<PhoneContact> paramArrayList);
void startRemarkAfterAgree(Activity paramActivity, int paramInt, String paramString, long paramLong, Bundle paramBundle);
void updateCustomNoteTxt(TextView paramTextView, int paramInt1, int paramInt2);
}

View File

@ -0,0 +1,19 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$AddFrdSNInfo extends MessageMicro<structmsg$AddFrdSNInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field uint32_not_see_dynamic = PBField.initUInt32(0);
public final PBUInt32Field uint32_set_sn = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint32_not_see_dynamic", "uint32_set_sn" }, new Object[] { integer, integer }, structmsg$AddFrdSNInfo.class);
}
}

View File

@ -0,0 +1,54 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$FlagInfo extends MessageMicro<structmsg$FlagInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field FrdMsg_Discuss2ManyChat = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_GetBusiCard = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_NeedWaitingMsg = PBField.initUInt32(0);
public final PBUInt32Field FrdMsg_uint32_need_all_unread_msg = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetC2cInviteJoinGroup = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetDisbandedByAdmin = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetOfficialAccount = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_GetPayInGroup = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_HiddenGrp = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_Kick_Admin = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_NeedAutoAdminWording = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_NotAllowJoinGrp_InviteNotFrd = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_WordingDown = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_get_quit_pay_group_msg_flag = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_get_transfer_group_msg_flag = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_mask_invite_auto_join = PBField.initUInt32(0);
public final PBUInt32Field GrpMsg_support_invite_auto_join = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 16, 24, 32, 40, 48, 56, 64, 72, 80,
88, 96, 104, 112, 120, 128, 136 }, new String[] {
"GrpMsg_Kick_Admin", "GrpMsg_HiddenGrp", "GrpMsg_WordingDown", "FrdMsg_GetBusiCard", "GrpMsg_GetOfficialAccount", "GrpMsg_GetPayInGroup", "FrdMsg_Discuss2ManyChat", "GrpMsg_NotAllowJoinGrp_InviteNotFrd", "FrdMsg_NeedWaitingMsg", "FrdMsg_uint32_need_all_unread_msg",
"GrpMsg_NeedAutoAdminWording", "GrpMsg_get_transfer_group_msg_flag", "GrpMsg_get_quit_pay_group_msg_flag", "GrpMsg_support_invite_auto_join", "GrpMsg_mask_invite_auto_join", "GrpMsg_GetDisbandedByAdmin", "GrpMsg_GetC2cInviteJoinGroup" }, new Object[] {
integer, integer, integer, integer, integer, integer, integer, integer, integer, integer,
integer, integer, integer, integer, integer, integer, integer }, structmsg$FlagInfo.class);
}
}

View File

@ -0,0 +1,13 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
public final class structmsg$FriendInfo extends MessageMicro<structmsg$FriendInfo> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18 }, new String[] { "msg_joint_friend", "msg_blacklist" }, new Object[] { "", "" }, structmsg$FriendInfo.class);
public final PBStringField msg_blacklist = PBField.initString("");
public final PBStringField msg_joint_friend = PBField.initString("");
}

View File

@ -0,0 +1,27 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$GroupInfo extends MessageMicro<structmsg$GroupInfo> {
static final FieldMap __fieldMap__;
public final PBUInt32Field display_action = PBField.initUInt32(0);
public final PBUInt32Field group_auth_type = PBField.initUInt32(0);
public final PBStringField msg_alert = PBField.initString("");
public final PBStringField msg_detail_alert = PBField.initString("");
public final PBStringField msg_other_admin_done = PBField.initString("");
public final PBUInt32Field uint32_app_privilege_flag = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 34, 42, 48 }, new String[] { "group_auth_type", "display_action", "msg_alert", "msg_detail_alert", "msg_other_admin_done", "uint32_app_privilege_flag" }, new Object[] { integer, integer, "", "", "", integer }, structmsg$GroupInfo.class);
}
}

View File

@ -0,0 +1,21 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$MsgInviteExt extends MessageMicro<structmsg$MsgInviteExt> {
static final FieldMap __fieldMap__;
public final PBUInt32Field uint32_src_type = PBField.initUInt32(0);
public final PBUInt32Field uint32_wait_state = PBField.initUInt32(0);
public final PBUInt64Field uint64_src_code = PBField.initUInt64(0L);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24 }, new String[] { "uint32_src_type", "uint64_src_code", "uint32_wait_state" }, new Object[] { integer, Long.valueOf(0L), integer }, structmsg$MsgInviteExt.class);
}
}

View File

@ -0,0 +1,18 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$MsgPayGroupExt extends MessageMicro<structmsg$MsgPayGroupExt> {
static final FieldMap __fieldMap__;
public final PBUInt64Field uint64_join_grp_time = PBField.initUInt64(0L);
public final PBUInt64Field uint64_quit_grp_time = PBField.initUInt64(0L);
static {
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16 }, new String[] { "uint64_join_grp_time", "uint64_quit_grp_time" }, new Object[] { long_, long_ }, structmsg$MsgPayGroupExt.class);
}
}

View File

@ -0,0 +1,37 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqNextSystemMsg extends MessageMicro<structmsg$ReqNextSystemMsg> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$FlagInfo flag = new structmsg$FlagInfo();
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt32Field msg_num = PBField.initUInt32(0);
public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 42, 48, 56, 64, 72, 128 }, new String[] { "msg_num", "following_friend_seq", "following_group_seq", "checktype", "flag", "language", "version", "friend_msg_type_flag", "uint32_req_msg_type", "uint32_need_uid" }, new Object[] { integer, long_, long_, Integer.valueOf(1), null, integer, integer, long_, integer, integer }, structmsg$ReqNextSystemMsg.class);
}
}

View File

@ -0,0 +1,35 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgAction extends MessageMicro<structmsg$ReqSystemMsgAction> {
static final FieldMap __fieldMap__;
public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo();
public final PBUInt32Field group_msg_type = PBField.initUInt32(0);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt64Field msg_seq = PBField.initUInt64(0L);
public final PBEnumField msg_type = PBField.initEnum(1);
public final PBUInt64Field req_uin = PBField.initUInt64(0L);
public final PBUInt32Field src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 56, 66, 72 }, new String[] { "msg_type", "msg_seq", "req_uin", "sub_type", "src_id", "sub_src_id", "group_msg_type", "action_info", "language" }, new Object[] { Integer.valueOf(1), long_, long_, integer, integer, integer, integer, null, integer }, structmsg$ReqSystemMsgAction.class);
}
}

View File

@ -0,0 +1,49 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgNew extends MessageMicro<structmsg$ReqSystemMsgNew> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$FlagInfo flag = new structmsg$FlagInfo();
public final PBUInt64Field friend_msg_type_flag = PBField.initUInt64(0L);
public final PBBoolField is_get_frd_ribbon = PBField.initBool(true);
public final PBBoolField is_get_grp_ribbon = PBField.initBool(true);
public final PBUInt32Field language = PBField.initUInt32(0);
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBUInt32Field msg_num = PBField.initUInt32(0);
public final PBUInt32Field uint32_need_uid = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
Boolean bool = Boolean.TRUE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 16, 24, 32, 40, 50, 56, 64, 72, 80,
88, 128 }, new String[] {
"msg_num", "latest_friend_seq", "latest_group_seq", "version", "checktype", "flag", "language", "is_get_frd_ribbon", "is_get_grp_ribbon", "friend_msg_type_flag",
"uint32_req_msg_type", "uint32_need_uid" }, new Object[] {
integer, long_, long_, integer, Integer.valueOf(1), null, integer, bool, bool, long_,
integer, integer }, structmsg$ReqSystemMsgNew.class);
}
}

View File

@ -0,0 +1,27 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$ReqSystemMsgRead extends MessageMicro<structmsg$ReqSystemMsgRead> {
static final FieldMap __fieldMap__;
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBUInt32Field type = PBField.initUInt32(0);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
static {
Long long_ = Long.valueOf(0L);
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40 }, new String[] { "latest_friend_seq", "latest_group_seq", "type", "checktype", "uint32_req_msg_type" }, new Object[] { long_, long_, integer, Integer.valueOf(1), integer }, structmsg$ReqSystemMsgRead.class);
}
}

View File

@ -0,0 +1,15 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBInt32Field;
import com.tencent.mobileqq.pb.PBStringField;
public final class structmsg$RspHead extends MessageMicro<structmsg$RspHead> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 18 }, new String[] { "result", "msg_fail" }, new Object[] { Integer.valueOf(0), "" }, structmsg$RspHead.class);
public final PBStringField msg_fail = PBField.initString("");
public final PBInt32Field result = PBField.initInt32(0);
}

View File

@ -0,0 +1,37 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$RspNextSystemMsg extends MessageMicro<structmsg$RspNextSystemMsg> {
static final FieldMap __fieldMap__;
public final PBStringField bytes_game_nick = PBField.initString("");
public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public structmsg$RspHead head = new structmsg$RspHead();
public final PBRepeatMessageField<structmsg$StructMsg> msgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0);
static {
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 32, 40, 802, 810, 816 }, new String[] { "head", "msgs", "following_friend_seq", "following_group_seq", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3" }, new Object[] { null, null, long_, long_, Integer.valueOf(1), "", byteStringMicro, Integer.valueOf(0) }, structmsg$RspNextSystemMsg.class);
}
}

View File

@ -0,0 +1,25 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$RspSystemMsgAction extends MessageMicro<structmsg$RspSystemMsgAction> {
static final FieldMap __fieldMap__;
public structmsg$RspHead head = new structmsg$RspHead();
public final PBStringField msg_detail = PBField.initString("");
public final PBStringField msg_invalid_decided = PBField.initString("");
public final PBUInt32Field remark_result = PBField.initUInt32(0);
public final PBUInt32Field type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 42, 48 }, new String[] { "head", "msg_detail", "type", "msg_invalid_decided", "remark_result" }, new Object[] { null, "", integer, "", integer }, structmsg$RspSystemMsgAction.class);
}
}

View File

@ -0,0 +1,66 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$RspSystemMsgNew extends MessageMicro<structmsg$RspSystemMsgNew> {
static final FieldMap __fieldMap__;
public final PBStringField bytes_game_nick = PBField.initString("");
public final PBBytesField bytes_undecid_for_qim = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField checktype = PBField.initEnum(1);
public final PBUInt64Field following_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field following_group_seq = PBField.initUInt64(0L);
public final PBRepeatMessageField<structmsg$StructMsg> friendmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBRepeatMessageField<structmsg$StructMsg> groupmsgs = PBField.initRepeatMessage(structmsg$StructMsg.class);
public final PBStringField grp_msg_display = PBField.initString("");
public structmsg$RspHead head = new structmsg$RspHead();
public final PBUInt64Field latest_friend_seq = PBField.initUInt64(0L);
public final PBUInt64Field latest_group_seq = PBField.initUInt64(0L);
public final PBStringField msg_display = PBField.initString("");
public structmsg$StructMsg msg_ribbon_friend = new structmsg$StructMsg();
public structmsg$StructMsg msg_ribbon_group = new structmsg$StructMsg();
public final PBUInt32Field uint32_has_suspicious_flag = PBField.initUInt32(0);
public final PBUInt32Field uint32_over = PBField.initUInt32(0);
public final PBUInt32Field uint32_un_read_count3 = PBField.initUInt32(0);
public final PBUInt32Field unread_friend_count = PBField.initUInt32(0);
public final PBUInt32Field unread_group_count = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
10, 16, 24, 32, 40, 48, 56, 74, 82, 90,
98, 106, 114, 120, 160, 802, 810, 816, 824 }, new String[] {
"head", "unread_friend_count", "unread_group_count", "latest_friend_seq", "latest_group_seq", "following_friend_seq", "following_group_seq", "friendmsgs", "groupmsgs", "msg_ribbon_friend",
"msg_ribbon_group", "msg_display", "grp_msg_display", "uint32_over", "checktype", "bytes_game_nick", "bytes_undecid_for_qim", "uint32_un_read_count3", "uint32_has_suspicious_flag" }, new Object[] {
null, integer, integer, long_, long_, long_, long_, null, null, null,
null, "", "", integer, Integer.valueOf(1), "", byteStringMicro, integer, integer }, structmsg$RspSystemMsgNew.class);
}
}

View File

@ -0,0 +1,17 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$RspSystemMsgRead extends MessageMicro<structmsg$RspSystemMsgRead> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 16, 24 }, new String[] { "head", "type", "checktype" }, new Object[] { null, Integer.valueOf(0), Integer.valueOf(1) }, structmsg$RspSystemMsgRead.class);
public final PBEnumField checktype = PBField.initEnum(1);
public structmsg$RspHead head = new structmsg$RspHead();
public final PBUInt32Field type = PBField.initUInt32(0);
}

View File

@ -0,0 +1,31 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$StructMsg extends MessageMicro<structmsg$StructMsg> {
static final FieldMap __fieldMap__;
public structmsg$SystemMsg msg = new structmsg$SystemMsg();
public final PBUInt64Field msg_seq = PBField.initUInt64(0L);
public final PBUInt64Field msg_time = PBField.initUInt64(0L);
public final PBEnumField msg_type = PBField.initEnum(1);
public final PBUInt64Field req_uin = PBField.initUInt64(0L);
public final PBUInt32Field uint32_unread_flag = PBField.initUInt32(0);
public final PBUInt32Field version = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 24, 32, 40, 48, 402 }, new String[] { "version", "msg_type", "msg_seq", "msg_time", "req_uin", "uint32_unread_flag", "msg" }, new Object[] { integer, Integer.valueOf(1), long_, long_, long_, integer, null }, structmsg$StructMsg.class);
}
}

View File

@ -0,0 +1,186 @@
package tencent.mobileim.structmsg;
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.PBInt32Field;
import com.tencent.mobileqq.pb.PBRepeatMessageField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$SystemMsg extends MessageMicro<structmsg$SystemMsg> {
static final FieldMap __fieldMap__;
public final PBUInt64Field action_uin = PBField.initUInt64(0L);
public final PBStringField action_uin_nick;
public final PBBytesField action_uin_qq_nick;
public final PBBytesField action_uin_remark;
public final PBRepeatMessageField<structmsg$SystemMsgAction> actions = PBField.initRepeatMessage(structmsg$SystemMsgAction.class);
public final PBUInt64Field actor_uin = PBField.initUInt64(0L);
public final PBStringField actor_uin_nick;
public final PBBytesField bytes_addtion;
public final PBBytesField bytes_game_msg;
public final PBBytesField bytes_game_nick;
public final PBBytesField bytes_name_more;
public final PBBytesField bytes_source_desc;
public final PBBytesField bytes_transparent_group_notify;
public final PBBytesField bytes_warning_tips;
public final PBUInt32Field card_switch;
public final PBUInt64Field clone_uin = PBField.initUInt64(0L);
public final PBStringField clone_uin_nick;
public final PBBytesField eim_group_id_name;
public structmsg$FriendInfo friend_info = new structmsg$FriendInfo();
public final PBUInt64Field group_code = PBField.initUInt64(0L);
public final PBUInt32Field group_ext_flag;
public structmsg$GroupInfo group_info = new structmsg$GroupInfo();
public final PBUInt32Field group_inviter_role = PBField.initUInt32(0);
public final PBUInt32Field group_msg_type = PBField.initUInt32(0);
public final PBStringField group_name;
public final PBStringField msg_actor_describe = PBField.initString("");
public final PBStringField msg_additional = PBField.initString("");
public final PBStringField msg_additional_list = PBField.initString("");
public final PBStringField msg_decided = PBField.initString("");
public final PBStringField msg_describe = PBField.initString("");
public final PBStringField msg_detail;
public structmsg$MsgInviteExt msg_invite_extinfo = new structmsg$MsgInviteExt();
public structmsg$MsgPayGroupExt msg_pay_group_extinfo = new structmsg$MsgPayGroupExt();
public final PBStringField msg_qna;
public final PBStringField msg_source = PBField.initString("");
public final PBStringField msg_title = PBField.initString("");
public final PBBytesField pic_url;
public final PBUInt32Field relation = PBField.initUInt32(0);
public final PBUInt32Field req_uin_age;
public final PBBytesField req_uin_business_card;
public final PBInt32Field req_uin_faceid;
public final PBUInt32Field req_uin_gender;
public final PBStringField req_uin_nick;
public final PBBytesField req_uin_pre_remark;
public final PBUInt32Field reqsubtype = PBField.initUInt32(0);
public final PBUInt32Field src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_src_id = PBField.initUInt32(0);
public final PBUInt32Field sub_type = PBField.initUInt32(0);
public final PBStringField uid;
public final PBUInt32Field uint32_c2c_invite_join_group_flag;
public final PBUInt32Field uint32_doubt_flag;
public final PBUInt32Field uint32_group_flagext3;
public final PBUInt32Field uint32_source_flag = PBField.initUInt32(0);
public final PBUInt64Field uint64_discuss_uin = PBField.initUInt64(0L);
public final PBUInt64Field uint64_eim_group_id = PBField.initUInt64(0L);
public final PBUInt64Field uint64_group_owner_uin;
static {
Integer integer = Integer.valueOf(0);
Long long_ = Long.valueOf(0L);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
__fieldMap__ = MessageMicro.initFieldMap(new int[] {
8, 18, 26, 34, 42, 50, 56, 64, 74, 80,
88, 96, 104, 114, 122, 128, 138, 146, 152, 160,
168, 176, 184, 194, 202, 208, 218, 226, 232, 240,
248, 258, 266, 274, 282, 400, 410, 418, 426, 434,
442, 456, 466, 474, 482, 490, 506, 514, 522, 530,
536, 544, 552, 808, 866, 882 }, new String[] {
"sub_type", "msg_title", "msg_describe", "msg_additional", "msg_source", "msg_decided", "src_id", "sub_src_id", "actions", "group_code",
"action_uin", "group_msg_type", "group_inviter_role", "friend_info", "group_info", "actor_uin", "msg_actor_describe", "msg_additional_list", "relation", "reqsubtype",
"clone_uin", "uint64_discuss_uin", "uint64_eim_group_id", "msg_invite_extinfo", "msg_pay_group_extinfo", "uint32_source_flag", "bytes_game_nick", "bytes_game_msg", "uint32_group_flagext3", "uint64_group_owner_uin",
"uint32_doubt_flag", "bytes_warning_tips", "bytes_name_more", "bytes_addtion", "bytes_transparent_group_notify", "req_uin_faceid", "req_uin_nick", "group_name", "action_uin_nick", "msg_qna",
"msg_detail", "group_ext_flag", "actor_uin_nick", "pic_url", "clone_uin_nick", "req_uin_business_card", "eim_group_id_name", "req_uin_pre_remark", "action_uin_qq_nick", "action_uin_remark",
"req_uin_gender", "req_uin_age", "uint32_c2c_invite_join_group_flag", "card_switch", "bytes_source_desc", "uid" }, new Object[] {
integer, "", "", "", "", "", integer, integer, null, long_,
long_, integer, integer, null, null, long_, "", "", integer, integer,
long_, long_, long_, null, null, integer, byteStringMicro, byteStringMicro, integer, long_,
integer, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, integer, "", "", "", "",
"", integer, "", byteStringMicro, "", byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro, byteStringMicro,
integer, integer, integer, integer, byteStringMicro, "" }, structmsg$SystemMsg.class);
}
public structmsg$SystemMsg() {
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
this.bytes_game_nick = PBField.initBytes(byteStringMicro);
this.bytes_game_msg = PBField.initBytes(byteStringMicro);
this.uint32_group_flagext3 = PBField.initUInt32(0);
this.uint64_group_owner_uin = PBField.initUInt64(0L);
this.uint32_doubt_flag = PBField.initUInt32(0);
this.bytes_warning_tips = PBField.initBytes(byteStringMicro);
this.bytes_name_more = PBField.initBytes(byteStringMicro);
this.bytes_addtion = PBField.initBytes(byteStringMicro);
this.bytes_transparent_group_notify = PBField.initBytes(byteStringMicro);
this.req_uin_faceid = PBField.initInt32(0);
this.req_uin_nick = PBField.initString("");
this.group_name = PBField.initString("");
this.action_uin_nick = PBField.initString("");
this.msg_qna = PBField.initString("");
this.msg_detail = PBField.initString("");
this.group_ext_flag = PBField.initUInt32(0);
this.actor_uin_nick = PBField.initString("");
this.pic_url = PBField.initBytes(byteStringMicro);
this.clone_uin_nick = PBField.initString("");
this.req_uin_business_card = PBField.initBytes(byteStringMicro);
this.eim_group_id_name = PBField.initBytes(byteStringMicro);
this.req_uin_pre_remark = PBField.initBytes(byteStringMicro);
this.action_uin_qq_nick = PBField.initBytes(byteStringMicro);
this.action_uin_remark = PBField.initBytes(byteStringMicro);
this.req_uin_gender = PBField.initUInt32(0);
this.req_uin_age = PBField.initUInt32(0);
this.uint32_c2c_invite_join_group_flag = PBField.initUInt32(0);
this.card_switch = PBField.initUInt32(0);
this.bytes_source_desc = PBField.initBytes(byteStringMicro);
this.uid = PBField.initString("");
}
}

View File

@ -0,0 +1,20 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
public final class structmsg$SystemMsgAction extends MessageMicro<structmsg$SystemMsgAction> {
static final FieldMap __fieldMap__ = MessageMicro.initFieldMap(new int[] { 10, 18, 24, 34, 42 }, new String[] { "name", "result", "action", "action_info", "detail_name" }, new Object[] { "", "", Integer.valueOf(0), null, "" }, structmsg$SystemMsgAction.class);
public final PBUInt32Field action = PBField.initUInt32(0);
public structmsg$SystemMsgActionInfo action_info = new structmsg$SystemMsgActionInfo();
public final PBStringField detail_name = PBField.initString("");
public final PBStringField name = PBField.initString("");
public final PBStringField result = PBField.initString("");
}

View File

@ -0,0 +1,40 @@
package tencent.mobileim.structmsg;
import com.tencent.mobileqq.pb.ByteStringMicro;
import com.tencent.mobileqq.pb.MessageMicro;
import com.tencent.mobileqq.pb.PBBoolField;
import com.tencent.mobileqq.pb.PBBytesField;
import com.tencent.mobileqq.pb.PBEnumField;
import com.tencent.mobileqq.pb.PBField;
import com.tencent.mobileqq.pb.PBStringField;
import com.tencent.mobileqq.pb.PBUInt32Field;
import com.tencent.mobileqq.pb.PBUInt64Field;
public final class structmsg$SystemMsgActionInfo extends MessageMicro<structmsg$SystemMsgActionInfo> {
static final FieldMap __fieldMap__;
public structmsg$AddFrdSNInfo addFrdSNInfo = new structmsg$AddFrdSNInfo();
public final PBBoolField blacklist = PBField.initBool(false);
public final PBUInt64Field group_code = PBField.initUInt64(0L);
public final PBUInt32Field group_id = PBField.initUInt32(0);
public final PBStringField msg = PBField.initString("");
public final PBStringField remark = PBField.initString("");
public final PBBytesField sig = PBField.initBytes(ByteStringMicro.EMPTY);
public final PBEnumField type = PBField.initEnum(1);
public final PBUInt32Field uint32_req_msg_type = PBField.initUInt32(0);
static {
Integer integer = Integer.valueOf(0);
ByteStringMicro byteStringMicro = ByteStringMicro.EMPTY;
Boolean bool = Boolean.FALSE;
__fieldMap__ = MessageMicro.initFieldMap(new int[] { 8, 16, 26, 402, 408, 418, 424, 434, 440 }, new String[] { "type", "group_code", "sig", "msg", "group_id", "remark", "blacklist", "addFrdSNInfo", "uint32_req_msg_type" }, new Object[] { Integer.valueOf(1), Long.valueOf(0L), byteStringMicro, "", integer, "", bool, null, integer }, structmsg$SystemMsgActionInfo.class);
}
}

View File

@ -1,19 +1,30 @@
@file:OptIn(DelicateCoroutinesApi::class) @file:OptIn(DelicateCoroutinesApi::class)
@file:Suppress("IllegalIdentifier")
package moe.fuqiuluo.qqinterface.servlet package moe.fuqiuluo.qqinterface.servlet
import com.tencent.common.app.AppInterface
import com.tencent.mobileqq.data.Friends import com.tencent.mobileqq.data.Friends
import com.tencent.mobileqq.friend.api.IFriendDataService import com.tencent.mobileqq.friend.api.IFriendDataService
import com.tencent.mobileqq.friend.api.IFriendHandlerService import com.tencent.mobileqq.friend.api.IFriendHandlerService
import com.tencent.mobileqq.qroute.QRoute
import com.tencent.mobileqq.relation.api.IAddFriendTempApi
import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.DelicateCoroutinesApi
import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.GlobalScope
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.suspendCancellableCoroutine
import moe.fuqiuluo.qqinterface.servlet.BaseSvc import moe.fuqiuluo.qqinterface.servlet.BaseSvc
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.app.AppRuntime import mqq.app.AppRuntime
import mqq.app.MobileQQ import mqq.app.MobileQQ
import tencent.mobileim.structmsg.`structmsg$FlagInfo`
import tencent.mobileim.structmsg.`structmsg$ReqSystemMsgNew`
import tencent.mobileim.structmsg.`structmsg$RspSystemMsgNew`
import kotlin.coroutines.resume import kotlin.coroutines.resume
import tencent.mobileim.structmsg.`structmsg$SystemMsgActionInfo` as ActionInfo
import tencent.mobileim.structmsg.`structmsg$AddFrdSNInfo` as AddFrdSNInfo
import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg
internal object FriendSvc: BaseSvc() { internal object FriendSvc: BaseSvc() {
@ -28,6 +39,64 @@ internal object FriendSvc: BaseSvc() {
return Result.success(service.allFriends) return Result.success(service.allFriends)
} }
// ProfileService.Pb.ReqSystemMsgAction.Friend
fun requestFriendRequest(msgSeq: Long, uin: Long, remark: String = "", approve: Boolean? = true, notSee: Boolean? = false) {
val app = AppRuntimeFetcher.appRuntime
if (app !is AppInterface)
throw RuntimeException("AppRuntime cannot cast to AppInterface")
val service = QRoute.api(IAddFriendTempApi::class.java)
val action = ActionInfo()
action.type.set(if (approve != false) 2 else 3)
action.group_id.set(0)
action.remark.set(remark)
val snInfo = AddFrdSNInfo()
snInfo.uint32_not_see_dynamic.set(if (notSee != false) 1 else 0)
snInfo.uint32_set_sn.set(0)
action.addFrdSNInfo.set(snInfo)
service.sendFriendSystemMsgAction(1, msgSeq, uin, 1, 2004, 11, 0, action, 0, StructMsg(), false,
app
)
}
suspend fun requestFriendSystemMsgNew(msgNum: Int, latestFriendSeq: Long, latestGroupSeq: Long): List<StructMsg>? {
val req = `structmsg$ReqSystemMsgNew`()
req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq)
req.latest_group_seq.set(latestGroupSeq)
req.version.set(1000)
req.checktype.set(2)
val flag = `structmsg$FlagInfo`()
// flag.GrpMsg_Kick_Admin.set(1)
// flag.GrpMsg_HiddenGrp.set(1)
// flag.GrpMsg_WordingDown.set(1)
flag.FrdMsg_GetBusiCard.set(1)
// flag.GrpMsg_GetOfficialAccount.set(1)
// flag.GrpMsg_GetPayInGroup.set(1)
flag.FrdMsg_Discuss2ManyChat.set(1)
// flag.GrpMsg_NotAllowJoinGrp_InviteNotFrd.set(1)
flag.FrdMsg_NeedWaitingMsg.set(1)
flag.FrdMsg_uint32_need_all_unread_msg.set(1)
// flag.GrpMsg_NeedAutoAdminWording.set(1)
// flag.GrpMsg_get_transfer_group_msg_flag.set(1)
// flag.GrpMsg_get_quit_pay_group_msg_flag.set(1)
// flag.GrpMsg_support_invite_auto_join.set(1)
// flag.GrpMsg_mask_invite_auto_join.set(1)
// flag.GrpMsg_GetDisbandedByAdmin.set(1)
flag.GrpMsg_GetC2cInviteJoinGroup.set(1)
req.flag.set(flag)
req.is_get_frd_ribbon.set(false)
req.is_get_grp_ribbon.set(false)
req.friend_msg_type_flag.set(1)
req.uint32_req_msg_type.set(1)
req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Friend", true, req.toByteArray())
?: return ArrayList()
val msg = `structmsg$RspSystemMsgNew`()
msg.mergeFrom(respBuffer.slice(4))
return msg.friendmsgs.get()
}
private suspend fun requestFriendList(runtime: AppRuntime, dataService: IFriendDataService): Boolean { private suspend fun requestFriendList(runtime: AppRuntime, dataService: IFriendDataService): Boolean {
val service = runtime.getRuntimeService(IFriendHandlerService::class.java, "all") val service = runtime.getRuntimeService(IFriendHandlerService::class.java, "all")
service.requestFriendList(true, 0) service.requestFriendList(true, 0)

View File

@ -8,6 +8,8 @@ import com.tencent.mobileqq.app.QQAppInterface
import com.tencent.mobileqq.data.troop.TroopInfo import com.tencent.mobileqq.data.troop.TroopInfo
import com.tencent.mobileqq.data.troop.TroopMemberInfo import com.tencent.mobileqq.data.troop.TroopMemberInfo
import com.tencent.mobileqq.pb.ByteStringMicro import com.tencent.mobileqq.pb.ByteStringMicro
import com.tencent.mobileqq.qroute.QRoute
import com.tencent.mobileqq.relation.api.IAddFriendTempApi
import com.tencent.mobileqq.troop.api.ITroopInfoService import com.tencent.mobileqq.troop.api.ITroopInfoService
import com.tencent.mobileqq.troop.api.ITroopMemberInfoService import com.tencent.mobileqq.troop.api.ITroopMemberInfoService
import com.tencent.protofile.join_group_link.join_group_link import com.tencent.protofile.join_group_link.join_group_link
@ -23,6 +25,9 @@ import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withTimeoutOrNull import kotlinx.coroutines.withTimeoutOrNull
import moe.fuqiuluo.proto.ProtoUtils import moe.fuqiuluo.proto.ProtoUtils
import moe.fuqiuluo.proto.asInt
import moe.fuqiuluo.proto.asList
import moe.fuqiuluo.proto.asLong
import moe.fuqiuluo.proto.asUtf8String import moe.fuqiuluo.proto.asUtf8String
import moe.fuqiuluo.proto.protobufOf import moe.fuqiuluo.proto.protobufOf
import moe.fuqiuluo.shamrock.helper.LogCenter import moe.fuqiuluo.shamrock.helper.LogCenter
@ -40,7 +45,10 @@ import java.lang.reflect.Method
import java.lang.reflect.Modifier import java.lang.reflect.Modifier
import java.nio.ByteBuffer import java.nio.ByteBuffer
import kotlin.coroutines.resume 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$RspSystemMsgNew` as RspSystemMsgNew
import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg
internal object GroupSvc: BaseSvc() { internal object GroupSvc: BaseSvc() {
private val RefreshTroopMemberInfoLock by lazy { private val RefreshTroopMemberInfoLock by lazy {
Mutex() Mutex()
@ -573,4 +581,88 @@ internal object GroupSvc: BaseSvc() {
Result.failure(Exception("获取群成员信息失败")) Result.failure(Exception("获取群成员信息失败"))
} }
} }
// ProfileService.Pb.ReqSystemMsgAction.Group
suspend fun requestGroupRequest(msgSeq: Long, uin: Long, gid: Long, msg: String? = "", approve: Boolean? = true, notSee: Boolean? = false): Result<String>{
// val app = AppRuntimeFetcher.appRuntime
// if (app !is AppInterface)
// throw RuntimeException("AppRuntime cannot cast to AppInterface")
// val service = QRoute.api(IAddFriendTempApi::class.java)
// val action = `structmsg$SystemMsgActionInfo`()
// action.type.set(if (approve != false) 11 else 12)
// action.group_code.set(gid)
// action.msg.set(msg)
// val snInfo = `structmsg$AddFrdSNInfo`()
// snInfo.uint32_not_see_dynamic.set(if (notSee != false) 1 else 0)
//// snInfo.uint32_set_sn.set(0)
// action.addFrdSNInfo.set(snInfo)
// service.sendFriendSystemMsgAction(2, msgSeq * 1000, uin, 1, 2, 30024, 1, action, 0, `structmsg$StructMsg`(), false,
// app
// )
// 实在找不到接口了 发pb吧
val buffer = protobufOf(
1 to 2,
2 to msgSeq,
3 to uin,
4 to 1,
5 to 2,
6 to 30024,
7 to 1,
8 to mapOf(
1 to if (approve != false) 11 else 12,
2 to gid
),
9 to 1000
).toByteArray()
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgAction.Group", true, buffer)
?: return Result.failure(Exception("操作失败"))
val result = ProtoUtils.decodeFromByteArray(respBuffer.slice(4))
return if (result.has(1, 1)) {
if (result[1, 1].asInt == 0) {
Result.success(result[2].asUtf8String)
} else {
Result.failure(Exception(result[2].asUtf8String))
}
} else {
Result.failure(Exception("操作失败"))
}
}
suspend fun requestGroupSystemMsgNew(msgNum: Int, latestFriendSeq: Long, latestGroupSeq: Long): List<StructMsg>? {
val req = ReqSystemMsgNew()
req.msg_num.set(msgNum)
req.latest_friend_seq.set(latestFriendSeq)
req.latest_group_seq.set(latestGroupSeq)
req.version.set(1000)
req.checktype.set(3)
val flag = FlagInfo()
flag.GrpMsg_Kick_Admin.set(1)
flag.GrpMsg_HiddenGrp.set(1)
flag.GrpMsg_WordingDown.set(1)
// flag.FrdMsg_GetBusiCard.set(1)
flag.GrpMsg_GetOfficialAccount.set(1)
flag.GrpMsg_GetPayInGroup.set(1)
flag.FrdMsg_Discuss2ManyChat.set(1)
flag.GrpMsg_NotAllowJoinGrp_InviteNotFrd.set(1)
flag.FrdMsg_NeedWaitingMsg.set(1)
// flag.FrdMsg_uint32_need_all_unread_msg.set(1)
flag.GrpMsg_NeedAutoAdminWording.set(1)
flag.GrpMsg_get_transfer_group_msg_flag.set(1)
flag.GrpMsg_get_quit_pay_group_msg_flag.set(1)
flag.GrpMsg_support_invite_auto_join.set(1)
flag.GrpMsg_mask_invite_auto_join.set(1)
flag.GrpMsg_GetDisbandedByAdmin.set(1)
flag.GrpMsg_GetC2cInviteJoinGroup.set(1)
req.flag.set(flag)
req.is_get_frd_ribbon.set(false)
req.is_get_grp_ribbon.set(false)
req.friend_msg_type_flag.set(1)
req.uint32_req_msg_type.set(1)
req.uint32_need_uid.set(1)
val respBuffer = sendBufferAW("ProfileService.Pb.ReqSystemMsgNew.Group", true, req.toByteArray())
?: return ArrayList()
val msg = RspSystemMsgNew()
msg.mergeFrom(respBuffer.slice(4))
return msg.groupmsgs.get()
}
} }

View File

@ -63,6 +63,7 @@ internal object HTTPServer {
otherAction() otherAction()
guildAction() guildAction()
testAction() testAction()
requestRouter()
if (ShamrockConfig.isDev()) { if (ShamrockConfig.isDev()) {
qsign() qsign()
obtainProtocolData() obtainProtocolData()

View File

@ -40,6 +40,9 @@ internal object ActionManager {
DeleteGroupFile, GetGroupFileSystemInfo, GetGroupRootFiles, GetGroupSubFiles, DeleteGroupFile, GetGroupFileSystemInfo, GetGroupRootFiles, GetGroupSubFiles,
GetGroupFileUrl, UploadPrivateFile, GetGroupFileUrl, UploadPrivateFile,
//REQUEST ACTION
SetFriendAddRequest, SetGroupAddRequest,
// GUILD // GUILD
GetGuildServiceProfile, GetGuildServiceProfile,

View File

@ -0,0 +1,36 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.FriendSvc
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 SetFriendAddRequest: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val flag = session.getString("flag")
val approve = session.getBoolean("approve")
val remark = session.getStringOrNull("remark")
val notSeen = session.getBoolean("notSeen")
return invoke(flag, approve, remark, notSeen, session.echo)
}
operator fun invoke(flag: String, approve: Boolean? = true, remark: String? = "", notSeen: Boolean? = false, echo: JsonElement = EmptyJsonString): String {
val flags = flag.split(";")
val ts = flags[0].toLong()
// val src = flags[1].toInt()
// val subSrc = flags[2].toInt()
val applier = flags[3].toLong()
return try {
FriendSvc.requestFriendRequest(ts, applier, remark ?: "", approve, notSeen)
ok("成功", echo)
} catch (err: Throwable) {
err.printStackTrace()
error("失败:${err.message}", echo)
}
}
override fun path(): String = "set_friend_add_request"
}

View File

@ -0,0 +1,41 @@
package moe.fuqiuluo.shamrock.remote.action.handlers
import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.qqinterface.servlet.FriendSvc
import moe.fuqiuluo.qqinterface.servlet.GroupSvc
import moe.fuqiuluo.shamrock.remote.action.ActionSession
import moe.fuqiuluo.shamrock.remote.action.IActionHandler
import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeSubType
import moe.fuqiuluo.shamrock.tools.EmptyJsonString
internal object SetGroupAddRequest: IActionHandler() {
override suspend fun internalHandle(session: ActionSession): String {
val flag = session.getString("flag")
val approve = session.getBoolean("approve")
val remark = session.getStringOrNull("reason")
val notSeen = session.getBoolean("notSeen")
val subType = session.getString("sub_type")
return invoke(flag, approve, subType, remark, notSeen, session.echo)
}
suspend operator fun invoke(flag: String, approve: Boolean? = true, subType: String, remark: String? = "", notSeen: Boolean? = false, echo: JsonElement = EmptyJsonString): String {
val flags = flag.split(";")
val ts = flags[0].toLong()
val groupCode = flags[1].toLong()
val applier = flags[2].toLong()
return try {
val result = GroupSvc.requestGroupRequest(ts, applier, groupCode, remark ?: "", approve, notSeen)
if (result.isSuccess) {
ok(result.getOrNull(), echo)
} else {
logic(result.getOrNull() ?: "", echo)
}
} catch (err: Throwable) {
err.printStackTrace()
error("失败:${err.message}", echo)
}
}
override fun path(): String = "set_group_add_request"
}

View File

@ -0,0 +1,39 @@
package moe.fuqiuluo.shamrock.remote.api
import io.ktor.http.ContentType
import io.ktor.server.application.call
import io.ktor.server.response.respondText
import io.ktor.server.routing.Routing
import moe.fuqiuluo.shamrock.remote.action.handlers.SetFriendAddRequest
import moe.fuqiuluo.shamrock.remote.action.handlers.SetGroupAddRequest
import moe.fuqiuluo.shamrock.tools.fetchOrNull
import moe.fuqiuluo.shamrock.tools.fetchOrThrow
import moe.fuqiuluo.shamrock.tools.getOrPost
fun Routing.requestRouter() {
getOrPost("/set_friend_add_request") {
val flag = fetchOrThrow("flag")
val approve = fetchOrNull("approve")?.toBooleanStrict() ?: true
val remark = fetchOrNull("remark")
val notSeen = fetchOrNull("not_seen")?.toBooleanStrict() ?: false
call.respondText(
SetFriendAddRequest(flag, approve, remark, notSeen),
ContentType.Application.Json
)
}
getOrPost("/set_group_add_request") {
val flag = fetchOrThrow("flag")
val approve = fetchOrNull("approve")?.toBooleanStrict() ?: true
val remark = fetchOrNull("reason")
val subType = fetchOrNull("sub_type")
val notSeen = fetchOrNull("not_seen")?.toBooleanStrict() ?: false
call.respondText(
SetGroupAddRequest(flag, approve, subType ?: "add", remark, notSeen),
ContentType.Application.Json
)
}
}

View File

@ -10,6 +10,8 @@ import io.ktor.server.request.uri
import io.ktor.server.response.respond import io.ktor.server.response.respond
import io.ktor.util.AttributeKey import io.ktor.util.AttributeKey
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
import moe.fuqiuluo.shamrock.helper.Level
import moe.fuqiuluo.shamrock.helper.LogCenter
import moe.fuqiuluo.shamrock.remote.entries.CommonResult import moe.fuqiuluo.shamrock.remote.entries.CommonResult
import moe.fuqiuluo.shamrock.remote.entries.ErrorCatch import moe.fuqiuluo.shamrock.remote.entries.ErrorCatch
import moe.fuqiuluo.shamrock.remote.entries.Status import moe.fuqiuluo.shamrock.remote.entries.Status
@ -55,6 +57,7 @@ fun Application.statusPages() {
val echo = if (call.attributes.contains(ECHO_KEY)) { val echo = if (call.attributes.contains(ECHO_KEY)) {
call.attributes[ECHO_KEY] call.attributes[ECHO_KEY]
} else null } else null
LogCenter.log(cause.stackTraceToString(), Level.ERROR)
call.respond(CommonResult( call.respond(CommonResult(
status = "failed", status = "failed",
retcode = Status.InternalHandlerError.code, retcode = Status.InternalHandlerError.code,

View File

@ -317,6 +317,7 @@ internal object GlobalEventTransmitter: BaseSvc() {
operator: Long, operator: Long,
reason: String, reason: String,
groupCode: Long, groupCode: Long,
flag: String,
subType: NoticeSubType subType: NoticeSubType
): Boolean { ): Boolean {
pushNotice(NoticeEvent( pushNotice(NoticeEvent(
@ -327,7 +328,8 @@ internal object GlobalEventTransmitter: BaseSvc() {
operatorId = operator, operatorId = operator,
tip = reason, tip = reason,
groupId = groupCode, groupId = groupCode,
subType = subType subType = subType,
flag = flag
)) ))
return true return true
} }
@ -367,7 +369,7 @@ internal object GlobalEventTransmitter: BaseSvc() {
return true return true
} }
suspend fun transFriendApply(time: Long, operation: Long, tipText: String): Boolean { suspend fun transFriendApply(time: Long, operation: Long, tipText: String, flag: String): Boolean {
pushNotice(NoticeEvent( pushNotice(NoticeEvent(
time = time, time = time,
selfId = app.longAccountUin, selfId = app.longAccountUin,
@ -375,7 +377,8 @@ internal object GlobalEventTransmitter: BaseSvc() {
type = NoticeType.FriendApply, type = NoticeType.FriendApply,
operatorId = operation, operatorId = operation,
userId = operation, userId = operation,
tip = tipText tip = tipText,
flag = flag
)) ))
return true return true
} }

View File

@ -58,6 +58,7 @@ internal data class NoticeEvent(
@SerialName("target_id") val target: Long = 0, @SerialName("target_id") val target: Long = 0,
@SerialName("file") val file: GroupFileMsg? = null, @SerialName("file") val file: GroupFileMsg? = null,
@SerialName("private_file") val privateFile: PrivateFileMsg? = null, @SerialName("private_file") val privateFile: PrivateFileMsg? = null,
@SerialName("flag") val flag: String? = null,
) )
@Serializable @Serializable

View File

@ -1,6 +1,7 @@
@file:OptIn(DelicateCoroutinesApi::class) @file:OptIn(DelicateCoroutinesApi::class)
package moe.fuqiuluo.shamrock.remote.service.listener package moe.fuqiuluo.shamrock.remote.service.listener
import com.arthenica.smartexception.ThrowableWrapper
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.DelicateCoroutinesApi
import moe.fuqiuluo.shamrock.helper.ContactHelper import moe.fuqiuluo.shamrock.helper.ContactHelper
@ -19,6 +20,8 @@ import moe.fuqiuluo.proto.ProtoUtils
import moe.fuqiuluo.proto.asByteArray import moe.fuqiuluo.proto.asByteArray
import moe.fuqiuluo.proto.asList import moe.fuqiuluo.proto.asList
import moe.fuqiuluo.proto.asULong import moe.fuqiuluo.proto.asULong
import moe.fuqiuluo.qqinterface.servlet.FriendSvc.requestFriendSystemMsgNew
import moe.fuqiuluo.qqinterface.servlet.GroupSvc.requestGroupSystemMsgNew
import moe.fuqiuluo.shamrock.helper.MessageHelper import moe.fuqiuluo.shamrock.helper.MessageHelper
import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeSubType import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeSubType
import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeType import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeType
@ -114,9 +117,19 @@ internal object PrimitiveListener {
if (applier == 0L) { if (applier == 0L) {
applier = pb[4, 3, 8].asLong applier = pb[4, 3, 8].asLong
} }
val msg_time = pb[1, 3, 2, 1, 9].asLong
val src = pb[1, 3, 2, 1, 7].asInt
val subSrc = pb[1, 3, 2, 1, 8].asInt
val reqs = requestFriendSystemMsgNew(20, 0, 0)
val req = reqs?.first {
it.msg_time.get() == msg_time
}
val seq = req?.msg_seq?.get()
val flag = "$seq;$src;$subSrc;$applier"
LogCenter.log("来自$applier 的好友申请:$msg ($source)") LogCenter.log("来自$applier 的好友申请:$msg ($source)")
if(!GlobalEventTransmitter.PrivateNoticeTransmitter if(!GlobalEventTransmitter.PrivateNoticeTransmitter
.transFriendApply(msgTime, applier, msg)) { .transFriendApply(msgTime, applier, msg, flag)) {
LogCenter.log("好友申请推送失败!", Level.WARN) LogCenter.log("好友申请推送失败!", Level.WARN)
} }
} }
@ -324,22 +337,51 @@ internal object PrimitiveListener {
val applierUid = pb[1, 3, 2, 3].asUtf8String val applierUid = pb[1, 3, 2, 3].asUtf8String
val reason = pb[1, 3, 2, 5].asUtf8String val reason = pb[1, 3, 2, 5].asUtf8String
val applier = ContactHelper.getUinByUidAsync(applierUid).toLong() val applier = ContactHelper.getUinByUidAsync(applierUid).toLong()
LogCenter.log("入群申请($groupCode) $applier: \"$reason\"") val msg_time = pb[1, 2, 6].asLong
if(!GlobalEventTransmitter.GroupNoticeTransmitter LogCenter.log("$msg_time 入群申请($groupCode) $applier: \"$reason\"")
.transGroupApply(time, applier, reason, groupCode, NoticeSubType.Add)) { try {
val reqs = requestGroupSystemMsgNew(20, 0, 0)
val req = reqs?.first {
it.msg_time.get() == msg_time
}
val seq = req?.msg_seq?.get()
val flag = "$seq;$groupCode;$applierUid"
if(!seq?.let {
GlobalEventTransmitter.GroupNoticeTransmitter
.transGroupApply(it, applier, reason, groupCode, flag, NoticeSubType.Add)
}!!) {
LogCenter.log("入群申请推送失败!", Level.WARN)
}
} catch (err: Throwable) {
LogCenter.log("入群申请推送失败!", Level.WARN) LogCenter.log("入群申请推送失败!", Level.WARN)
LogCenter.log(err.stackTraceToString(), Level.ERROR)
} }
} }
528 -> { 528 -> {
val groupCode = pb[1, 3, 2, 2, 3].asULong val groupCode = pb[1, 3, 2, 2, 3].asULong
val applierUid = pb[1, 3, 2, 2, 5].asUtf8String val applierUid = pb[1, 3, 2, 2, 5].asUtf8String
val applier = ContactHelper.getUinByUidAsync(applierUid).toLong() val applier = ContactHelper.getUinByUidAsync(applierUid).toLong()
val msg_time = pb[1, 2, 6].asLong
LogCenter.log("邀请入群申请($groupCode): $applier") LogCenter.log("邀请入群申请($groupCode): $applier")
try {
val reqs = requestGroupSystemMsgNew(20, 0, 0)
val req = reqs?.first {
it.msg_time.get() == msg_time
}
val seq = req?.msg_seq?.get()
val flag = "$seq;$groupCode;$applierUid"
if(!seq?.let {
GlobalEventTransmitter.GroupNoticeTransmitter
.transGroupApply(it, applier, "", groupCode, flag, NoticeSubType.Invite)
}!!) {
LogCenter.log("邀请入群申请推送失败!", Level.WARN)
}
if(!GlobalEventTransmitter.GroupNoticeTransmitter } catch (err: Throwable) {
.transGroupApply(time, applier, "", groupCode, NoticeSubType.Invite)) {
LogCenter.log("邀请入群申请推送失败!", Level.WARN) LogCenter.log("邀请入群申请推送失败!", Level.WARN)
LogCenter.log(err.stackTraceToString(), Level.ERROR)
} }
} }
} }