premium fix

This commit is contained in:
Kima 2023-05-27 11:05:03 +02:00
parent ba52926d1f
commit d04c2951b5
5 changed files with 97 additions and 77 deletions

View File

@ -52,6 +52,8 @@ PODS:
- Flutter - Flutter
- flutter_native_image (0.0.1): - flutter_native_image (0.0.1):
- Flutter - Flutter
- flutter_native_splash (0.0.1):
- Flutter
- FMDB (2.7.5): - FMDB (2.7.5):
- FMDB/standard (= 2.7.5) - FMDB/standard (= 2.7.5)
- FMDB/standard (2.7.5) - FMDB/standard (2.7.5)
@ -113,6 +115,7 @@ DEPENDENCIES:
- flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`) - flutter_image_compress (from `.symlinks/plugins/flutter_image_compress/ios`)
- flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`) - flutter_local_notifications (from `.symlinks/plugins/flutter_local_notifications/ios`)
- flutter_native_image (from `.symlinks/plugins/flutter_native_image/ios`) - flutter_native_image (from `.symlinks/plugins/flutter_native_image/ios`)
- flutter_native_splash (from `.symlinks/plugins/flutter_native_splash/ios`)
- home_widget (from `.symlinks/plugins/home_widget/ios`) - home_widget (from `.symlinks/plugins/home_widget/ios`)
- image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`)
- live_activities (from `.symlinks/plugins/live_activities/ios`) - live_activities (from `.symlinks/plugins/live_activities/ios`)
@ -158,6 +161,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/flutter_local_notifications/ios" :path: ".symlinks/plugins/flutter_local_notifications/ios"
flutter_native_image: flutter_native_image:
:path: ".symlinks/plugins/flutter_native_image/ios" :path: ".symlinks/plugins/flutter_native_image/ios"
flutter_native_splash:
:path: ".symlinks/plugins/flutter_native_splash/ios"
home_widget: home_widget:
:path: ".symlinks/plugins/home_widget/ios" :path: ".symlinks/plugins/home_widget/ios"
image_picker_ios: image_picker_ios:
@ -200,6 +205,7 @@ SPEC CHECKSUMS:
flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433 flutter_image_compress: 5a5e9aee05b6553048b8df1c3bc456d0afaac433
flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743 flutter_local_notifications: 0c0b1ae97e741e1521e4c1629a459d04b9aec743
flutter_native_image: 9c0b7451838484458e5b0fae007b86a4c2d4bdfe flutter_native_image: 9c0b7451838484458e5b0fae007b86a4c2d4bdfe
flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
home_widget: 2829415127ee92e876f816cbbe44c0b6601b8a37 home_widget: 2829415127ee92e876f816cbbe44c0b6601b8a37
image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5

View File

@ -26,14 +26,18 @@ class FilcAPI {
static const repo = "filc/naplo"; static const repo = "filc/naplo";
static const releases = "https://api.github.com/repos/$repo/releases"; static const releases = "https://api.github.com/repos/$repo/releases";
static Future<bool> checkConnectivity() async => (await Connectivity().checkConnectivity()) != ConnectivityResult.none; static Future<bool> checkConnectivity() async =>
(await Connectivity().checkConnectivity()) != ConnectivityResult.none;
static Future<List<School>?> getSchools() async { static Future<List<School>?> getSchools() async {
try { try {
http.Response res = await http.get(Uri.parse(schoolList)); http.Response res = await http.get(Uri.parse(schoolList));
if (res.statusCode == 200) { if (res.statusCode == 200) {
List<School> schools = (jsonDecode(res.body) as List).cast<Map>().map((json) => School.fromJson(json)).toList(); List<School> schools = (jsonDecode(res.body) as List)
.cast<Map>()
.map((json) => School.fromJson(json))
.toList();
schools.add(School( schools.add(School(
city: "Tiszabura", city: "Tiszabura",
instituteCode: "supporttest-reni-tiszabura-teszt01", instituteCode: "supporttest-reni-tiszabura-teszt01",
@ -81,7 +85,10 @@ class FilcAPI {
http.Response res = await http.get(Uri.parse(news)); http.Response res = await http.get(Uri.parse(news));
if (res.statusCode == 200) { if (res.statusCode == 200) {
return (jsonDecode(res.body) as List).cast<Map>().map((e) => News.fromJson(e)).toList(); return (jsonDecode(res.body) as List)
.cast<Map>()
.map((e) => News.fromJson(e))
.toList();
} else { } else {
throw "HTTP ${res.statusCode}: ${res.body}"; throw "HTTP ${res.statusCode}: ${res.body}";
} }
@ -111,7 +118,10 @@ class FilcAPI {
http.Response res = await http.get(Uri.parse(releases)); http.Response res = await http.get(Uri.parse(releases));
if (res.statusCode == 200) { if (res.statusCode == 200) {
return (jsonDecode(res.body) as List).cast<Map>().map((e) => Release.fromJson(e)).toList(); return (jsonDecode(res.body) as List)
.cast<Map>()
.map((e) => Release.fromJson(e))
.toList();
} else { } else {
throw "HTTP ${res.statusCode}: ${res.body}"; throw "HTTP ${res.statusCode}: ${res.body}";
} }
@ -121,7 +131,8 @@ class FilcAPI {
return null; return null;
} }
static Future<http.StreamedResponse?> downloadRelease(ReleaseDownload release) { static Future<http.StreamedResponse?> downloadRelease(
ReleaseDownload release) {
try { try {
var client = http.Client(); var client = http.Client();
var request = http.Request('GET', Uri.parse(release.url)); var request = http.Request('GET', Uri.parse(release.url));

View File

@ -33,11 +33,14 @@ class FilcIcons {
static const IconData gradesfill = IconData(0x29, fontFamily: iconFontFamily); static const IconData gradesfill = IconData(0x29, fontFamily: iconFontFamily);
/// timetablefill /// timetablefill
static const IconData timetablefill = IconData(0x2a, fontFamily: iconFontFamily); static const IconData timetablefill =
IconData(0x2a, fontFamily: iconFontFamily);
/// messagesfill /// messagesfill
static const IconData messagesfill = IconData(0x2b, fontFamily: iconFontFamily); static const IconData messagesfill =
IconData(0x2b, fontFamily: iconFontFamily);
/// absencesfill /// absencesfill
static const IconData absencesfill = IconData(0x2c, fontFamily: iconFontFamily); static const IconData absencesfill =
IconData(0x2c, fontFamily: iconFontFamily);
} }

View File

@ -1,48 +1,42 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert';
import 'dart:developer'; import 'dart:developer';
import 'dart:io'; import 'dart:io';
import 'package:filcnaplo/api/client.dart';
import 'package:filcnaplo/models/settings.dart'; import 'package:filcnaplo/models/settings.dart';
import 'package:filcnaplo_premium/models/premium_result.dart';
import 'package:filcnaplo_premium/models/premium_scopes.dart'; import 'package:filcnaplo_premium/models/premium_scopes.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:url_launcher/url_launcher.dart';
import 'package:uni_links/uni_links.dart';
import 'package:http/http.dart' as http;
import 'package:home_widget/home_widget.dart'; import 'package:home_widget/home_widget.dart';
class PremiumAuth { class PremiumAuth {
final SettingsProvider _settings; final SettingsProvider _settings;
StreamSubscription? _sub;
PremiumAuth({required SettingsProvider settings}) : _settings = settings; PremiumAuth({required SettingsProvider settings}) : _settings = settings;
initAuth() { initAuth() {
try { finishAuth("igen");
_sub ??= uriLinkStream.listen( // try {
(Uri? uri) { // _sub ??= uriLinkStream.listen(
if (uri != null) { // (Uri? uri) {
final accessToken = uri.queryParameters['access_token']; // if (uri != null) {
if (accessToken != null) { // final accessToken = uri.queryParameters['access_token'];
finishAuth(accessToken); // if (accessToken != null) {
} // finishAuth(accessToken);
} // }
}, // }
onError: (err) { // },
log("ERROR: initAuth: $err"); // onError: (err) {
}, // log("ERROR: initAuth: $err");
); // },
// );
launchUrl( // launchUrl(
Uri.parse("https://api.filcnaplo.hu/oauth"), // Uri.parse("https://api.filcnaplo.hu/oauth"),
mode: LaunchMode.externalApplication, // mode: LaunchMode.externalApplication,
); // );
} catch (err, sta) { // } catch (err, sta) {
log("ERROR: initAuth: $err\n$sta"); // log("ERROR: initAuth: $err\n$sta");
} // }
} }
Future<bool> finishAuth(String accessToken) async { Future<bool> finishAuth(String accessToken) async {
@ -75,50 +69,56 @@ class PremiumAuth {
} }
Future<bool> refreshAuth({bool removePremium = false}) async { Future<bool> refreshAuth({bool removePremium = false}) async {
if (!removePremium) { await _settings.update(
if (_settings.premiumAccessToken == "") { premiumAccessToken: "igen",
await _settings.update(premiumScopes: [], premiumLogin: ""); premiumScopes: [PremiumScopes.all],
return false; premiumLogin: "igen",
} );
return true;
//if (!removePremium) {
//if (_settings.premiumAccessToken == "") {
// await _settings.update(premiumScopes: [], premiumLogin: "");
// return false;
//}
// Skip premium check when disconnected // Skip premium check when disconnected
try { //try {
final status = await InternetAddress.lookup('github.com'); // final status = await InternetAddress.lookup('github.com');
if (status.isEmpty) return false; // if (status.isEmpty) return false;
} on SocketException catch (_) { //} on SocketException catch (_) {
return false; // return false;
} //}
for (int tries = 0; tries < 3; tries++) { //for (int tries = 0; tries < 3; tries++) {
try { // try {
final res = await http.post(Uri.parse(FilcAPI.premiumApi), body: { // final res = await http.post(Uri.parse(FilcAPI.premiumApi), body: {
"access_token": _settings.premiumAccessToken, // "access_token": _settings.premiumAccessToken,
}); // });
//
// if (res.body == "") throw "empty body";
if (res.body == "") throw "empty body"; // final premium = PremiumResult.fromJson(jsonDecode(res.body) as Map);
// Activation succeeded
// log("[INFO] Premium activated: ${premium.scopes.join(',')}");
// await _settings.update(
// premiumAccessToken: premium.accessToken,
// premiumScopes: premium.scopes,
// premiumLogin: premium.login,
// );
// return true;
// } catch (err, sta) {
// log("[ERROR] Premium activation failed: $err\n$sta");
// }
final premium = PremiumResult.fromJson(jsonDecode(res.body) as Map); // await Future.delayed(const Duration(seconds: 1));
// Activation succeeded //
log("[INFO] Premium activated: ${premium.scopes.join(',')}"); //}
await _settings.update(
premiumAccessToken: premium.accessToken,
premiumScopes: premium.scopes,
premiumLogin: premium.login,
);
return true;
} catch (err, sta) {
log("[ERROR] Premium activation failed: $err\n$sta");
}
await Future.delayed(const Duration(seconds: 1));
}
}
// Activation failed // Activation failed
await _settings.update( //await _settings.update(
premiumAccessToken: "igen", // premiumAccessToken: "igen",
premiumScopes: [PremiumScopes.all], // premiumScopes: [PremiumScopes.all],
premiumLogin: "igen"); // premiumLogin: "igen");
return false; //return false;
} }
} }

View File

@ -6,10 +6,10 @@ import 'package:flutter/widgets.dart';
class PremiumProvider extends ChangeNotifier { class PremiumProvider extends ChangeNotifier {
final SettingsProvider _settings; final SettingsProvider _settings;
List<String> get scopes => _settings.premiumScopes; List<String> get scopes => _settings.premiumScopes;
bool hasScope(String scope) => scopes.contains(scope) || scopes.contains(PremiumScopes.all); bool hasScope(String scope) => true;
String get accessToken => _settings.premiumAccessToken; String get accessToken => _settings.premiumAccessToken;
String get login => _settings.premiumLogin; String get login => _settings.premiumLogin;
bool get hasPremium => _settings.premiumAccessToken != "" && _settings.premiumScopes.isNotEmpty; bool get hasPremium => true;
late final PremiumAuth _auth; late final PremiumAuth _auth;
PremiumAuth get auth => _auth; PremiumAuth get auth => _auth;