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:Suppress("IllegalIdentifier")
package moe.fuqiuluo.qqinterface.servlet
import com.tencent.common.app.AppInterface
import com.tencent.mobileqq.data.Friends
import com.tencent.mobileqq.friend.api.IFriendDataService
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.GlobalScope
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.suspendCancellableCoroutine
import moe.fuqiuluo.qqinterface.servlet.BaseSvc
import moe.fuqiuluo.shamrock.tools.slice
import moe.fuqiuluo.shamrock.xposed.helper.AppRuntimeFetcher
import mqq.app.AppRuntime
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 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() {
@ -28,6 +39,64 @@ internal object FriendSvc: BaseSvc() {
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 {
val service = runtime.getRuntimeService(IFriendHandlerService::class.java, "all")
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.TroopMemberInfo
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.ITroopMemberInfoService
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.withTimeoutOrNull
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.protobufOf
import moe.fuqiuluo.shamrock.helper.LogCenter
@ -40,7 +45,10 @@ 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$RspSystemMsgNew` as RspSystemMsgNew
import tencent.mobileim.structmsg.`structmsg$StructMsg` as StructMsg
internal object GroupSvc: BaseSvc() {
private val RefreshTroopMemberInfoLock by lazy {
Mutex()
@ -573,4 +581,88 @@ internal object GroupSvc: BaseSvc() {
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()
guildAction()
testAction()
requestRouter()
if (ShamrockConfig.isDev()) {
qsign()
obtainProtocolData()

View File

@ -40,6 +40,9 @@ internal object ActionManager {
DeleteGroupFile, GetGroupFileSystemInfo, GetGroupRootFiles, GetGroupSubFiles,
GetGroupFileUrl, UploadPrivateFile,
//REQUEST ACTION
SetFriendAddRequest, SetGroupAddRequest,
// GUILD
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.util.AttributeKey
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.ErrorCatch
import moe.fuqiuluo.shamrock.remote.entries.Status
@ -55,6 +57,7 @@ fun Application.statusPages() {
val echo = if (call.attributes.contains(ECHO_KEY)) {
call.attributes[ECHO_KEY]
} else null
LogCenter.log(cause.stackTraceToString(), Level.ERROR)
call.respond(CommonResult(
status = "failed",
retcode = Status.InternalHandlerError.code,

View File

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

View File

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

View File

@ -1,6 +1,7 @@
@file:OptIn(DelicateCoroutinesApi::class)
package moe.fuqiuluo.shamrock.remote.service.listener
import com.arthenica.smartexception.ThrowableWrapper
import com.tencent.qqnt.kernel.nativeinterface.MsgConstant
import kotlinx.coroutines.DelicateCoroutinesApi
import moe.fuqiuluo.shamrock.helper.ContactHelper
@ -19,6 +20,8 @@ import moe.fuqiuluo.proto.ProtoUtils
import moe.fuqiuluo.proto.asByteArray
import moe.fuqiuluo.proto.asList
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.remote.service.data.push.NoticeSubType
import moe.fuqiuluo.shamrock.remote.service.data.push.NoticeType
@ -114,9 +117,19 @@ internal object PrimitiveListener {
if (applier == 0L) {
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)")
if(!GlobalEventTransmitter.PrivateNoticeTransmitter
.transFriendApply(msgTime, applier, msg)) {
.transFriendApply(msgTime, applier, msg, flag)) {
LogCenter.log("好友申请推送失败!", Level.WARN)
}
}
@ -324,22 +337,51 @@ internal object PrimitiveListener {
val applierUid = pb[1, 3, 2, 3].asUtf8String
val reason = pb[1, 3, 2, 5].asUtf8String
val applier = ContactHelper.getUinByUidAsync(applierUid).toLong()
LogCenter.log("入群申请($groupCode) $applier: \"$reason\"")
val msg_time = pb[1, 2, 6].asLong
if(!GlobalEventTransmitter.GroupNoticeTransmitter
.transGroupApply(time, applier, reason, groupCode, NoticeSubType.Add)) {
LogCenter.log("$msg_time 入群申请($groupCode) $applier: \"$reason\"")
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(err.stackTraceToString(), Level.ERROR)
}
}
528 -> {
val groupCode = pb[1, 3, 2, 2, 3].asULong
val applierUid = pb[1, 3, 2, 2, 5].asUtf8String
val applier = ContactHelper.getUinByUidAsync(applierUid).toLong()
val msg_time = pb[1, 2, 6].asLong
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
.transGroupApply(time, applier, "", groupCode, NoticeSubType.Invite)) {
} catch (err: Throwable) {
LogCenter.log("邀请入群申请推送失败!", Level.WARN)
LogCenter.log(err.stackTraceToString(), Level.ERROR)
}
}
}