Skip to content

Commit

Permalink
[Infrastructure] Updated the file services + minor changes
Browse files Browse the repository at this point in the history
  • Loading branch information
Wolfteam committed Aug 31, 2022
1 parent 159693d commit 76b03cf
Show file tree
Hide file tree
Showing 18 changed files with 228 additions and 111 deletions.
32 changes: 32 additions & 0 deletions lib/infrastructure/api_service.dart
@@ -0,0 +1,32 @@
import 'package:dio/dio.dart';
import 'package:shiori/domain/services/api_service.dart';
import 'package:shiori/domain/services/logging_service.dart';
import 'package:shiori/infrastructure/secrets.dart';

class ApiServiceImpl implements ApiService {
final LoggingService _loggingService;

final _dio = Dio();

ApiServiceImpl(this._loggingService);

@override
Future<String> getChangelog(String defaultValue) async {
try {
final url = '${Secrets.assetsBaseUrl}/changelog.md';
final response = await _dio.getUri<String>(Uri.parse(url));
if (response.statusCode != 200) {
_loggingService.warning(
runtimeType,
'getChangelog: Could not retrieve changelog, got status code = ${response.statusCode}, falling back to the default one',
);
return defaultValue;
}

return response.data!;
} catch (e, s) {
_loggingService.error(runtimeType, 'getChangelog: Unknown error occurred', e, s);
return defaultValue;
}
}
}
16 changes: 5 additions & 11 deletions lib/infrastructure/changelog_provider.dart
@@ -1,4 +1,4 @@
import 'package:http/http.dart' as http;
import 'package:shiori/domain/services/api_service.dart';
import 'package:shiori/domain/services/changelog_provider.dart';
import 'package:shiori/domain/services/logging_service.dart';
import 'package:shiori/domain/services/network_service.dart';
Expand All @@ -8,29 +8,23 @@ const _defaultChangelog = '''
#### NA
''';

const _url = 'https://raw.githubusercontent.com/Wolfteam/Shiori/main/Changelog.md';

class ChangelogProviderImpl implements ChangelogProvider {
final LoggingService _loggingService;
final NetworkService _networkService;
final ApiService _apiService;

@override
String get defaultChangelog => _defaultChangelog;
static const String defaultChangelog = _defaultChangelog;

ChangelogProviderImpl(this._loggingService, this._networkService);
ChangelogProviderImpl(this._loggingService, this._networkService, this._apiService);

@override
Future<String> load() async {
try {
if (!await _networkService.isInternetAvailable()) {
return _defaultChangelog;
}
final response = await http.Client().get(Uri.parse(_url));
if (response.statusCode != 200) {
return _defaultChangelog;
}

return response.body;
return await _apiService.getChangelog(_defaultChangelog);
} catch (e, s) {
_loggingService.error(runtimeType, 'Unknown error occurred while loading changelog', e, s);
return _defaultChangelog;
Expand Down
45 changes: 26 additions & 19 deletions lib/infrastructure/device_info_service.dart
Expand Up @@ -3,14 +3,18 @@ import 'dart:io';
import 'package:device_info_plus/device_info_plus.dart';
import 'package:flutter_user_agentx/flutter_user_agent.dart';
import 'package:package_info_plus/package_info_plus.dart';
import 'package:shiori/domain/app_constants.dart';
import 'package:shiori/domain/services/device_info_service.dart';
import 'package:store_checker/store_checker.dart';
import 'package:version_tracker/version_tracker.dart';

class DeviceInfoServiceImpl implements DeviceInfoService {
late Map<String, String> _deviceInfo;
final Map<String, String> _deviceInfo = {};
late String _version;
late String _versionWithBuildNumber;
late String _appName;
late bool _versionChanged = false;
late String _packageName;

@override
Map<String, String> get deviceInfo => _deviceInfo;
Expand All @@ -21,6 +25,9 @@ class DeviceInfoServiceImpl implements DeviceInfoService {
@override
String get version => _version;

@override
String get versionWithBuildNumber => _versionWithBuildNumber;

@override
bool get versionChanged => _versionChanged;

Expand All @@ -35,7 +42,9 @@ class DeviceInfoServiceImpl implements DeviceInfoService {
//TODO: VERSION DOES NOT MATCH THE ONE ON THE PUBSPEC
final packageInfo = await PackageInfo.fromPlatform();
_appName = packageInfo.appName;
_version = Platform.isWindows ? packageInfo.version : '${packageInfo.version}+${packageInfo.buildNumber}';
_version = packageInfo.version;
_packageName = packageInfo.packageName;
_versionWithBuildNumber = Platform.isWindows ? _version : '$_version+${packageInfo.buildNumber}';

await _initVersionTracker();

Expand All @@ -51,39 +60,37 @@ class DeviceInfoServiceImpl implements DeviceInfoService {
await FlutterUserAgent.init();
}
} catch (ex) {
_deviceInfo = {
'Model': 'N/A',
'OsVersion': 'N/A',
'AppVersion': 'N/A',
};
_version = _appName = 'N/A';
_version = _versionWithBuildNumber = _appName = _packageName = na;
_setDefaultDeviceInfoProps(na, na);
}
}

Future<void> _initForWindows() async {
final deviceInfo = DeviceInfoPlugin();
final info = await deviceInfo.windowsInfo;
final model = info.computerName;
_deviceInfo = {
'Model': model,
'OsVersion': 'N/A',
'AppVersion': _version,
};
_setDefaultDeviceInfoProps(info.computerName, na);
}

Future<void> _initForAndroid() async {
final deviceInfo = DeviceInfoPlugin();
final info = await deviceInfo.androidInfo;
_deviceInfo = {
'Model': info.model ?? 'N/A',
'OsVersion': '${info.version.sdkInt}',
'AppVersion': _version,
};
final installationSource = await StoreChecker.getSource;
final model = 'Model: ${info.model ?? na} --- Device: ${info.device ?? na} --- Manufacturer: ${info.manufacturer ?? na}';
_setDefaultDeviceInfoProps(model, '${info.version.sdkInt}');
_deviceInfo.putIfAbsent('IsPhysicalDevice', () => '${info.isPhysicalDevice ?? na}');
_deviceInfo.putIfAbsent('InstallationSource', () => installationSource.name);
}

Future<void> _initVersionTracker() async {
final vt = VersionTracker();
await vt.track();
_versionChanged = vt.isFirstLaunchForCurrentBuild ?? vt.isFirstLaunchForCurrentVersion ?? vt.isFirstLaunchEver ?? false;
}

void _setDefaultDeviceInfoProps(String model, String osVersion) {
_deviceInfo.putIfAbsent('Model', () => model);
_deviceInfo.putIfAbsent('OsVersion', () => osVersion);
_deviceInfo.putIfAbsent('AppVersion', () => _versionWithBuildNumber);
_deviceInfo.putIfAbsent('PackageName', () => _packageName);
}
}
15 changes: 11 additions & 4 deletions lib/infrastructure/file/artifact_file_service.dart
Expand Up @@ -6,16 +6,19 @@ import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/artifact_file_service.dart';
import 'package:shiori/domain/services/file/translation_file_service.dart';

class ArtifactFileServiceImpl implements ArtifactFileService {
class ArtifactFileServiceImpl extends ArtifactFileService {
final TranslationFileService _translations;

late ArtifactsFile _artifactsFile;

@override
TranslationFileService get translations => _translations;

ArtifactFileServiceImpl(this._translations);

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.artifactsDbPath);
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_artifactsFile = ArtifactsFile.fromJson(json);
}

Expand Down Expand Up @@ -55,9 +58,13 @@ class ArtifactFileServiceImpl implements ArtifactFileService {

@override
List<String> getArtifactRelatedParts(String fullImagePath, String image, int bonus) {
if (bonus == 1) {
return [fullImagePath];
}

var imageWithoutExt = image.split('.png').first;
imageWithoutExt = imageWithoutExt.substring(0, imageWithoutExt.length - 1);
return bonus == 1 ? [fullImagePath] : artifactOrder.map((e) => Assets.getArtifactPath('$imageWithoutExt$e.png')).toList();
return artifactOrder.map((e) => Assets.getArtifactPath('$imageWithoutExt$e.png')).toList();
}

@override
Expand Down
10 changes: 6 additions & 4 deletions lib/infrastructure/file/banner_history_file_service.dart
Expand Up @@ -2,23 +2,25 @@ import 'dart:math';

import 'package:collection/collection.dart';
import 'package:shiori/domain/app_constants.dart';
import 'package:shiori/domain/assets.dart';
import 'package:shiori/domain/enums/enums.dart';
import 'package:shiori/domain/extensions/double_extensions.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/file_infrastructure.dart';

class BannerHistoryFileServiceImpl implements BannerHistoryFileService {
class BannerHistoryFileServiceImpl extends BannerHistoryFileService {
final CharacterFileService _characters;
final WeaponFileService _weapons;

late BannerHistoryFile _bannerHistoryFile;

@override
TranslationFileService get translations => throw UnimplementedError('Translations are not required in this file');

BannerHistoryFileServiceImpl(this._characters, this._weapons);

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.bannerHistoryDbPath);
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_bannerHistoryFile = BannerHistoryFile.fromJson(json);
}

Expand Down
24 changes: 17 additions & 7 deletions lib/infrastructure/file/character_file_service.dart
Expand Up @@ -5,9 +5,7 @@ import 'package:shiori/domain/assets.dart';
import 'package:shiori/domain/enums/enums.dart';
import 'package:shiori/domain/extensions/string_extensions.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/character_file_service.dart';
import 'package:shiori/domain/services/file/file_infrastructure.dart';
import 'package:shiori/domain/services/file/translation_file_service.dart';
import 'package:shiori/domain/services/locale_service.dart';
import 'package:shiori/domain/utils/date_utils.dart';

Expand All @@ -20,11 +18,23 @@ class CharacterFileServiceImpl extends CharacterFileService {

late CharactersFile _charactersFile;

@override
TranslationFileService get translations => _translations;

@override
ArtifactFileService get artifacts => _artifacts;

@override
MaterialFileService get materials => _materials;

@override
WeaponFileService get weapons => _weapons;

CharacterFileServiceImpl(this._localeService, this._artifacts, this._materials, this._weapons, this._translations);

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.charactersDbPath);
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_charactersFile = CharactersFile.fromJson(json);
}

Expand Down Expand Up @@ -117,10 +127,10 @@ class CharacterFileServiceImpl extends CharacterFileService {

@override
List<ItemCommon> getCharacterForItemsUsingMaterial(String key) {
final material = _materials.getMaterial(key);
final imgs = <ItemCommon>[];
final chars = _charactersFile.characters.where((c) => !c.isComingSoon).toList();

for (final char in _charactersFile.characters.where((c) => !c.isComingSoon)) {
for (final char in chars) {
final multiTalentAscensionMaterials =
(char.multiTalentAscensionMaterials?.expand((e) => e.materials).expand((e) => e.materials) ?? <ItemAscensionMaterialFileModel>[]).toList();

Expand All @@ -130,7 +140,7 @@ class CharacterFileServiceImpl extends CharacterFileService {
final materials = multiTalentAscensionMaterials + ascensionMaterial + talentMaterial;
final allMaterials = _materials.getMaterialsFromAscensionMaterials(materials);

if (allMaterials.any((m) => m.key == material.key)) {
if (allMaterials.any((m) => m.key == key)) {
imgs.add(ItemCommon(char.key, Assets.getCharacterPath(char.image)));
}
}
Expand Down
10 changes: 6 additions & 4 deletions lib/infrastructure/file/element_file_service.dart
@@ -1,18 +1,20 @@
import 'package:shiori/domain/assets.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/element_file_service.dart';
import 'package:shiori/domain/services/file/translation_file_service.dart';

class ElementFileServiceImpl implements ElementFileService {
class ElementFileServiceImpl extends ElementFileService {
final TranslationFileService _translations;

late ElementsFile _elementsFile;

@override
TranslationFileService get translations => _translations;

ElementFileServiceImpl(this._translations);

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.elementsDbPath);
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_elementsFile = ElementsFile.fromJson(json);
}

Expand Down
12 changes: 7 additions & 5 deletions lib/infrastructure/file/furniture_file_service.dart
@@ -1,13 +1,15 @@
import 'package:shiori/domain/assets.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/furniture_file_service.dart';
import 'package:shiori/domain/services/file/file_infrastructure.dart';

class FurnitureFileServiceImpl implements FurnitureFileService {
class FurnitureFileServiceImpl extends FurnitureFileService {
late FurnitureFile _furnitureFile;

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.furnitureDbPath);
TranslationFileService get translations => throw UnimplementedError('Translations are not required in this file');

@override
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_furnitureFile = FurnitureFile.fromJson(json);
assert(
_furnitureFile.furniture.map((e) => e.key).toSet().length == _furnitureFile.furniture.length,
Expand Down
12 changes: 7 additions & 5 deletions lib/infrastructure/file/gadget_file_service.dart
@@ -1,13 +1,15 @@
import 'package:shiori/domain/assets.dart';
import 'package:shiori/domain/models/models.dart';
import 'package:shiori/domain/services/file/gadget_file_service.dart';
import 'package:shiori/domain/services/file/file_infrastructure.dart';

class GadgetFileServiceImpl implements GadgetFileService {
class GadgetFileServiceImpl extends GadgetFileService {
late GadgetsFile _gadgetsFile;

@override
Future<void> init() async {
final json = await Assets.getJsonFromPath(Assets.gadgetsDbPath);
TranslationFileService get translations => throw UnimplementedError('Translations are not required in this file');

@override
Future<void> init(String assetPath) async {
final json = await readJson(assetPath);
_gadgetsFile = GadgetsFile.fromJson(json);
assert(
_gadgetsFile.gadgets.map((e) => e.key).toSet().length == _gadgetsFile.gadgets.length,
Expand Down

0 comments on commit 76b03cf

Please sign in to comment.