feat: bugly自定义日志采集逻辑
This commit is contained in:
parent
4bfb11e1d1
commit
552c787c5a
@ -128,4 +128,7 @@
|
||||
}
|
||||
|
||||
-keep class com.tencent.mm.sdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
|
||||
-dontwarn com.tencent.bugly.**
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
@ -128,4 +128,7 @@
|
||||
}
|
||||
|
||||
-keep class com.tencent.mm.sdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
-keep class com.tencent.mm.opensdk.** { *; }
|
||||
|
||||
-dontwarn com.tencent.bugly.**
|
||||
-keep public class com.tencent.bugly.**{*;}
|
||||
@ -134,6 +134,7 @@
|
||||
<intent-filter>
|
||||
<action android:name="com.huawei.android.push.intent.REGISTRATION" />
|
||||
<action android:name="com.huawei.android.push.intent.RECEIVE" />
|
||||
|
||||
<category android:name="${applicationId}" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
@ -193,6 +194,9 @@
|
||||
</intent-filter>
|
||||
|
||||
</activity>
|
||||
<meta-data
|
||||
android:name="BUGLY_ENABLE_DEBUG"
|
||||
android:value="true" />
|
||||
</application>
|
||||
|
||||
|
||||
|
||||
@ -80,8 +80,8 @@ PODS:
|
||||
- Flutter (1.0.0)
|
||||
- flutter_blue_plus (0.0.1):
|
||||
- Flutter
|
||||
- flutter_bugly_plugin (0.0.1):
|
||||
- Bugly
|
||||
- flutter_bugly (0.0.1):
|
||||
- Bugly (= 2.6.1)
|
||||
- Flutter
|
||||
- flutter_local_notifications (0.0.1):
|
||||
- Flutter
|
||||
@ -173,7 +173,7 @@ DEPENDENCIES:
|
||||
- file_picker (from `.symlinks/plugins/file_picker/ios`)
|
||||
- Flutter (from `Flutter`)
|
||||
- flutter_blue_plus (from `.symlinks/plugins/flutter_blue_plus/ios`)
|
||||
- flutter_bugly_plugin (from `.symlinks/plugins/flutter_bugly_plugin/ios`)
|
||||
- flutter_bugly (from `.symlinks/plugins/flutter_bugly/ios`)
|
||||
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
|
||||
- flutter_native_contact_picker (from `.symlinks/plugins/flutter_native_contact_picker/ios`)
|
||||
- flutter_pcm_sound (from `.symlinks/plugins/flutter_pcm_sound/ios`)
|
||||
@ -252,8 +252,8 @@ EXTERNAL SOURCES:
|
||||
:path: Flutter
|
||||
flutter_blue_plus:
|
||||
:path: ".symlinks/plugins/flutter_blue_plus/ios"
|
||||
flutter_bugly_plugin:
|
||||
:path: ".symlinks/plugins/flutter_bugly_plugin/ios"
|
||||
flutter_bugly:
|
||||
:path: ".symlinks/plugins/flutter_bugly/ios"
|
||||
flutter_local_notifications:
|
||||
:path: ".symlinks/plugins/flutter_local_notifications/ios"
|
||||
flutter_native_contact_picker:
|
||||
@ -326,7 +326,7 @@ SPEC CHECKSUMS:
|
||||
file_picker: ce3938a0df3cc1ef404671531facef740d03f920
|
||||
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
|
||||
flutter_blue_plus: 4837da7d00cf5d441fdd6635b3a57f936778ea96
|
||||
flutter_bugly_plugin: d2db6d6641938269fa538575126e8ff530ee02c7
|
||||
flutter_bugly: bf35df32a9c5d50b8aacdd35bd8ddc5b55150dae
|
||||
flutter_local_notifications: 4cde75091f6327eb8517fa068a0a5950212d2086
|
||||
flutter_native_contact_picker: bd430ba0fbf82768bb50c2c52a69a65759a8f907
|
||||
flutter_pcm_sound: de0572ca4f99091cc2abfcc31601b8a4ddd33c0e
|
||||
|
||||
@ -2,10 +2,10 @@ import 'dart:async';
|
||||
import 'dart:io';
|
||||
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
||||
import 'package:star_lock/tools/commonDataManage.dart';
|
||||
|
||||
import 'io_tool/io_model.dart';
|
||||
@ -100,7 +100,7 @@ class BlueManage {
|
||||
void _initAdapterStateStateSubscription() {
|
||||
_adapterStateStateSubscription ??=
|
||||
FlutterBluePlus.adapterState.listen((BluetoothAdapterState state) {
|
||||
AppLog.log('蓝牙状态:$state');
|
||||
AppLog.log('蓝牙状态:$state');
|
||||
_adapterState = state;
|
||||
});
|
||||
}
|
||||
@ -228,7 +228,8 @@ class BlueManage {
|
||||
if (_adapterState == BluetoothAdapterState.on) {
|
||||
try {
|
||||
FlutterBluePlus.startScan(timeout: Duration(seconds: timeout));
|
||||
final StreamSubscription<List<ScanResult>> subscription = FlutterBluePlus.scanResults.listen((List<ScanResult> results) {
|
||||
final StreamSubscription<List<ScanResult>> subscription =
|
||||
FlutterBluePlus.scanResults.listen((List<ScanResult> results) {
|
||||
scanDevices.clear();
|
||||
for (final ScanResult scanResult in results) {
|
||||
// AppLog.log('扫描到的设备:${scanResult.device.platformName} ${scanResult.advertisementData.advName} ${scanResult.rssi}');
|
||||
@ -305,7 +306,10 @@ class BlueManage {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
FlutterBuglyPlugin.reportException(exceptionName: 'blueSendData isAvailable状态', reason: 'blueSendData isAvailable不可用');
|
||||
BuglyTool.uploadException(
|
||||
message: 'blueSendData isAvailable状态',
|
||||
detail: 'blueSendData isAvailable不可用--json');
|
||||
// FlutterBuglyPlugin.reportException(exceptionName: 'blueSendData isAvailable状态', reason: 'blueSendData isAvailable不可用');
|
||||
AppLog.log('开始扫描 蓝牙不可用,不能进行蓝牙操作');
|
||||
}
|
||||
});
|
||||
@ -358,13 +362,12 @@ class BlueManage {
|
||||
}
|
||||
|
||||
Future<void> _connectDevice(
|
||||
List<ScanResult> devicesList,
|
||||
String deviceName,
|
||||
ConnectStateCallBack connectStateCallBack,
|
||||
{
|
||||
bool isAddEquipment = false,// 是否是添加设备之前
|
||||
bool isReconnect = true,// 是否是重连
|
||||
}) async {
|
||||
List<ScanResult> devicesList,
|
||||
String deviceName,
|
||||
ConnectStateCallBack connectStateCallBack, {
|
||||
bool isAddEquipment = false, // 是否是添加设备之前
|
||||
bool isReconnect = true, // 是否是重连
|
||||
}) async {
|
||||
// 判断数组列表里面是否有这个设备
|
||||
// AppLog.log("devicesList:$devicesList");
|
||||
final int knownDeviceIndex = devicesList.indexWhere((ScanResult d) =>
|
||||
@ -392,15 +395,17 @@ class BlueManage {
|
||||
AppLog.log('调用了停止扫描的方法');
|
||||
await stopScan();
|
||||
|
||||
if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') && isAddEquipment == false) {
|
||||
if ((scanResult.advertisementData.serviceUuids[0].toString()[31] == '0') &&
|
||||
isAddEquipment == false) {
|
||||
// 添加这个判断是因为有些苹果设备或者安卓等性能比较好的设备时,添加完锁之后,锁板未改变为已添加状态之前,就进行了蓝牙连接,导致添加完锁就失败,这里进行了判断,如果第一次连接失败,就清除缓存重新扫描连接
|
||||
if(isReconnect == true){
|
||||
if (isReconnect == true) {
|
||||
AppLog.log('该锁已被重置, 重新发送扫描命令');
|
||||
scanDevices.clear();
|
||||
startScanSingle(deviceName, 15, (List<ScanResult> scanDevices) {
|
||||
_connectDevice(scanDevices, deviceName, connectStateCallBack, isAddEquipment: isAddEquipment, isReconnect: false);
|
||||
_connectDevice(scanDevices, deviceName, connectStateCallBack,
|
||||
isAddEquipment: isAddEquipment, isReconnect: false);
|
||||
});
|
||||
}else{
|
||||
} else {
|
||||
connectStateCallBack(BluetoothConnectionState.disconnected);
|
||||
EasyLoading.showToast('该锁已被重置'.tr, duration: 2000.milliseconds);
|
||||
scanDevices.clear();
|
||||
@ -459,8 +464,10 @@ class BlueManage {
|
||||
//循环判断服务
|
||||
for (final BluetoothService service in services) {
|
||||
if (service.uuid == _serviceIdConnect) {
|
||||
for (final BluetoothCharacteristic characteristic in service.characteristics) {
|
||||
if (characteristic.characteristicUuid == _characteristicIdSubscription) {
|
||||
for (final BluetoothCharacteristic characteristic
|
||||
in service.characteristics) {
|
||||
if (characteristic.characteristicUuid ==
|
||||
_characteristicIdSubscription) {
|
||||
_subScribeToCharacteristic(characteristic);
|
||||
bluetoothConnectionState = BluetoothConnectionState.connected;
|
||||
connectStateCallBack(bluetoothConnectionState!);
|
||||
|
||||
@ -4,6 +4,7 @@ import 'dart:io';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_bugly/flutter_bugly.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:path/path.dart' as path;
|
||||
import 'package:star_lock/flavors.dart';
|
||||
@ -23,30 +24,31 @@ import 'tools/store_service.dart';
|
||||
|
||||
// 该文件不可作为编译入口,请查看 flavorizr.yaml 中的说明
|
||||
FutureOr<void> main() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
FlutterBugly.postCatchedException(() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
|
||||
await _setCommonServices();
|
||||
await _setCommonServices();
|
||||
|
||||
// 设置国际化信息
|
||||
await _initTranslation();
|
||||
// 设置国际化信息
|
||||
await _initTranslation();
|
||||
|
||||
final bool isLogin = await getLoginStatus();
|
||||
if (isLogin) {
|
||||
await privacySDKInitialization();
|
||||
}
|
||||
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
final bool? openDeBug = await Storage.getBool(isOpenDeBug);
|
||||
if (openDeBug == true) {
|
||||
DeBug.showFloatWidget();
|
||||
final bool isLogin = await getLoginStatus();
|
||||
if (isLogin) {
|
||||
await privacySDKInitialization();
|
||||
}
|
||||
});
|
||||
|
||||
runApp(MyApp(isLogin: isLogin));
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) async {
|
||||
final bool? openDeBug = await Storage.getBool(isOpenDeBug);
|
||||
if (openDeBug == true) {
|
||||
DeBug.showFloatWidget();
|
||||
}
|
||||
});
|
||||
runApp(MyApp(isLogin: isLogin));
|
||||
});
|
||||
|
||||
if (AppPlatform.isAndroid) {
|
||||
const SystemUiOverlayStyle systemUiOverlayStyle =
|
||||
SystemUiOverlayStyle(statusBarColor: Colors.transparent);
|
||||
SystemUiOverlayStyle(statusBarColor: Colors.transparent);
|
||||
SystemChrome.setSystemUIOverlayStyle(systemUiOverlayStyle);
|
||||
}
|
||||
|
||||
@ -82,7 +84,7 @@ Future<void> privacySDKInitialization() async {
|
||||
await jpushProvider.initJPushService();
|
||||
}
|
||||
|
||||
void checkChinese(){
|
||||
void checkChinese() {
|
||||
// 获取当前脚本的目录
|
||||
final String scriptDir = path.dirname(Platform.script.path);
|
||||
|
||||
@ -104,4 +106,4 @@ void findChineseCharacters(Directory directory) {
|
||||
|
||||
bool hasChineseCharacters(String input) {
|
||||
return RegExp(r'[\u4e00-\u9fa5]').hasMatch(input);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2,7 +2,6 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter/scheduler.dart';
|
||||
import 'package:flutter_blue_plus/flutter_blue_plus.dart';
|
||||
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:get/get.dart';
|
||||
import 'package:intl/intl.dart';
|
||||
@ -11,8 +10,8 @@ import 'package:star_lock/common/XSConstantMacro/XSConstantMacro.dart';
|
||||
import 'package:star_lock/main/lockDetail/electronicKey/electronicKeyList/entity/ElectronicKeyListEntity.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockSet/lockTime/getServerDatetime_entity.dart';
|
||||
import 'package:star_lock/main/lockMian/entity/lockListInfo_entity.dart';
|
||||
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
||||
import 'package:star_lock/tools/throttler.dart';
|
||||
|
||||
import 'package:star_lock/widget/permission/permission_dialog.dart';
|
||||
|
||||
import '../../../app_settings/app_settings.dart';
|
||||
@ -334,7 +333,8 @@ class LockDetailLogic extends BaseGetXController {
|
||||
showBlueConnetctToastTimer(
|
||||
outTimer: 20,
|
||||
action: () {
|
||||
FlutterBuglyPlugin.reportException(exceptionName: '开门超时处理', reason: '开门超时,断开连接');
|
||||
// FlutterBuglyPlugin.reportException(exceptionName: '开门超时处理', reason: '开门超时,断开连接');
|
||||
BuglyTool.uploadException(message: '开门超时处理', detail: '开门超时,断开连接--json');
|
||||
resetOpenDoorState();
|
||||
blueManageDisconnect();
|
||||
});
|
||||
@ -351,7 +351,8 @@ class LockDetailLogic extends BaseGetXController {
|
||||
.blueSendData(state.keyInfos.value.bluetooth!.bluetoothDeviceName!,
|
||||
(BluetoothConnectionState deviceConnectionState) async {
|
||||
if (deviceConnectionState == BluetoothConnectionState.connected) {
|
||||
FlutterBuglyPlugin.reportException(exceptionName: '蓝牙连接成功', reason: '蓝牙连接成功,发送开锁指令');
|
||||
BuglyTool.uploadException(message: '蓝牙连接成功', detail: '蓝牙连接成功,发送开锁指令--json',data: {'key1':'value1','key2':'value2'});
|
||||
// FlutterBuglyPlugin.reportException(exceptionName: '蓝牙连接成功', reason: '蓝牙连接成功,发送开锁指令');
|
||||
IoSenderManage.senderOpenLock(
|
||||
lockID: BlueManage().connectDeviceName,
|
||||
userID: await Storage.getUid(),
|
||||
|
||||
@ -1,7 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
|
||||
import 'package:flutter_easyloading/flutter_easyloading.dart';
|
||||
import 'package:flutter_screenutil/flutter_screenutil.dart';
|
||||
import 'package:get/get.dart';
|
||||
@ -11,6 +10,7 @@ import 'package:star_lock/flavors.dart';
|
||||
import 'package:star_lock/main/lockDetail/lockDetail/lockDetail_state.dart';
|
||||
import 'package:star_lock/main/lockMian/lockMain/lockMain_logic.dart';
|
||||
import 'package:star_lock/tools/aliyunRealNameAuth/aliyunRealNameAuthHandle.dart';
|
||||
import 'package:star_lock/tools/bugly/bugly_tool.dart';
|
||||
import 'package:star_lock/tools/showCupertinoAlertView.dart';
|
||||
import 'package:star_lock/tools/showTipView.dart';
|
||||
import 'package:star_lock/widget/flavors_img.dart';
|
||||
@ -90,10 +90,17 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
|
||||
//鑫泓佳布局
|
||||
Widget xhjWidget() {
|
||||
final bool isShowTip =
|
||||
(state.keyInfos.value.keyType == XSConstantMacro.keyTypeTime || state.keyInfos.value.keyType == XSConstantMacro.keyTypeLoop)
|
||||
&& (DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) <= 15 && DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) >= 0)
|
||||
&& (state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusNormalUse || state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusWaitReceive);
|
||||
final bool isShowTip = (state.keyInfos.value.keyType ==
|
||||
XSConstantMacro.keyTypeTime ||
|
||||
state.keyInfos.value.keyType == XSConstantMacro.keyTypeLoop) &&
|
||||
(DateTool().compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) <=
|
||||
15 &&
|
||||
DateTool()
|
||||
.compareTimeGetDaysFromNow(state.keyInfos.value.endDate!) >=
|
||||
0) &&
|
||||
(state.keyInfos.value.keyStatus == XSConstantMacro.keyStatusNormalUse ||
|
||||
state.keyInfos.value.keyStatus ==
|
||||
XSConstantMacro.keyStatusWaitReceive);
|
||||
return Scaffold(
|
||||
backgroundColor: Colors.white,
|
||||
body: Obx(() {
|
||||
@ -1428,13 +1435,21 @@ class _LockDetailPageState extends State<LockDetailPage>
|
||||
if (isOpenLockNeedOnline) {
|
||||
// 不需要联网
|
||||
state.openDoorModel = 0;
|
||||
FlutterBuglyPlugin.reportException(exceptionName: '点击了不需要联网开锁');
|
||||
// FlutterBuglyPlugin.reportException(exceptionName: '点击了不需要联网开锁');
|
||||
BuglyTool.uploadException(
|
||||
message: '点击了不需要联网开锁',
|
||||
detail: '点击了不需要联网开锁--------json',
|
||||
data: {'key1': 'value1', 'key2': 'value2'});
|
||||
AppLog.log('点击开锁 state.openDoorModel = 0 不需要联网');
|
||||
logic.openDoorAction();
|
||||
} else {
|
||||
// 需要联网
|
||||
state.openDoorModel = 2;
|
||||
FlutterBuglyPlugin.reportException(exceptionName: '点击了需要联网开锁');
|
||||
// FlutterBuglyPlugin.reportException(exceptionName: '点击了需要联网开锁');
|
||||
BuglyTool.uploadException(
|
||||
message: '点击了需要联网开锁',
|
||||
detail: '点击了需要联网开锁---json',
|
||||
data: {'key1': 'value1', 'key2': 'value2'});
|
||||
AppLog.log('点击开锁 state.openDoorModel = 2 需要联网');
|
||||
logic.getLockNetToken();
|
||||
}
|
||||
|
||||
@ -2,7 +2,7 @@ import 'dart:async';
|
||||
|
||||
import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_bugly_plugin/flutter_bugly_plugin.dart';
|
||||
import 'package:flutter_bugly/flutter_bugly.dart';
|
||||
import 'package:star_lock/app_settings/app_settings.dart';
|
||||
import 'package:star_lock/flavors.dart';
|
||||
import 'package:star_lock/login/login/entity/LoginData.dart';
|
||||
@ -16,15 +16,15 @@ class BuglyTool {
|
||||
static Future<void> init() async {
|
||||
if (F.isProductionEnv) {
|
||||
//生产
|
||||
await FlutterBuglyPlugin.init(
|
||||
appIdAndroid: '5729fb97dc',
|
||||
appIdiOS: '33c4430cce',
|
||||
await FlutterBugly.init(
|
||||
androidAppId: '5729fb97dc',
|
||||
iOSAppId: '33c4430cce',
|
||||
);
|
||||
} else {
|
||||
//测试
|
||||
await FlutterBuglyPlugin.init(
|
||||
appIdAndroid: '5729fb97dc',
|
||||
appIdiOS: '33c4430cce',
|
||||
await FlutterBugly.init(
|
||||
androidAppId: '5729fb97dc',
|
||||
iOSAppId: '33c4430cce',
|
||||
);
|
||||
}
|
||||
|
||||
@ -33,28 +33,35 @@ class BuglyTool {
|
||||
setUserId(loginData?.userid);
|
||||
|
||||
//错误日志监控
|
||||
FlutterError.onError = (FlutterErrorDetails details) async {
|
||||
AppLog.log('error:${details.exception.toString()}',
|
||||
stackTrace: details.stack, error: true);
|
||||
FlutterBuglyPlugin.reportException(
|
||||
exceptionName: details.exception.toString(),
|
||||
reason: details.stack.toString());
|
||||
Zone.current.handleUncaughtError(
|
||||
details.exception, details.stack ?? StackTrace.empty);
|
||||
};
|
||||
// FlutterError.onError = (FlutterErrorDetails details) async {
|
||||
// AppLog.log('error:${details.exception.toString()}',
|
||||
// stackTrace: details.stack, error: true);
|
||||
// FlutterBugly.uploadException(
|
||||
// message: details.exception.toString(),
|
||||
// detail: details.stack.toString());
|
||||
// Zone.current.handleUncaughtError(
|
||||
// details.exception, details.stack ?? StackTrace.empty);
|
||||
// };
|
||||
|
||||
//错误日志监控
|
||||
PlatformDispatcher.instance.onError = (Object error, StackTrace stack) {
|
||||
AppLog.log('error:$error', stackTrace: stack, error: true);
|
||||
FlutterBuglyPlugin.reportException(
|
||||
exceptionName: error.toString(), reason: stack.toString());
|
||||
FlutterBugly.uploadException(
|
||||
message: error.toString(), detail: stack.toString());
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
//关联 userid
|
||||
static void setUserId(int? userId) {
|
||||
FlutterBuglyPlugin.setUserIdentifier(
|
||||
userIdentifier: (userId ?? 0).toString());
|
||||
FlutterBugly.setUserId(userId?.toString() ?? '');
|
||||
}
|
||||
|
||||
static void uploadException({
|
||||
required String message,
|
||||
required String detail,
|
||||
Map? data,
|
||||
}) {
|
||||
FlutterBugly.uploadException(message: message, detail: detail, data: data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -234,7 +234,8 @@ dependencies:
|
||||
colorfilter_generator: ^0.0.8
|
||||
file_picker: ^5.3.1
|
||||
# 错误日志监控
|
||||
flutter_bugly_plugin: ^0.0.9
|
||||
# flutter_bugly_plugin: ^0.0.9
|
||||
flutter_bugly: ^1.0.2
|
||||
open_filex: ^4.4.0
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user