diff --git a/Orarend/API.cs b/Orarend/API.cs index 2e5a49e..7233f14 100644 --- a/Orarend/API.cs +++ b/Orarend/API.cs @@ -56,7 +56,7 @@ namespace Orarend using (var sr = new StreamReader(resp.GetResponseStream())) { const string trtd = @"(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>(?!.+?\.+?)(.+?)(?=<\1(?:\s\w+=(?:\""|\')?(?:\w|[áéóüöőúű.:;])+(?:\""|\')?)*>)"; - string html = Regex.Replace(Regex.Replace(Regex.Replace(sr.ReadToEnd(), "]*)>((?:\\w|[áéóüöőúű.])+)(?=<)(?!\\/)", "$2"), "<(tr)" + trtd, "<$1>$2"), "<(td)" + trtd, "<$1>$2"); + string html = Regex.Replace(Regex.Replace(Regex.Replace(sr.ReadToEnd(), "]*)>((?:\\w|[áéóüöőúű./])+)(?=<)(?!\\/)", "$2"), "<(tr)" + trtd, "<$1>$2"), "<(td)" + trtd, "<$1>$2"); doc.LoadHtml(html); } }); @@ -76,6 +76,7 @@ namespace Orarend { Osztályok = doc.GetElementbyId("uok").ChildNodes.Where(node => node.HasAttributes).Select(node => new Osztály { Azonosító = node.GetAttributeValue("value", ""), Név = node.NextSibling.InnerText }).ToArray(); bool ahét = true; + int maxx = 0; foreach (var node in doc.GetElementbyId("oda").FirstChild.FirstChild.ChildNodes[1].ChildNodes) { switch (node.FirstChild.InnerText) @@ -89,6 +90,7 @@ namespace Orarend default: { int x = int.Parse(node.FirstChild.InnerText) - 1; + maxx = x > maxx ? x : maxx; órarend.Órakezdetek[x] = TimeSpan.Parse(node.FirstChild.Attributes["title"].Value.Split('-')[0].Trim()); var órák = (ahét ? órarend.ÓrákAHét : órarend.ÓrákBHét); for (int i = 0; i < 5; i++) //Napok @@ -126,6 +128,9 @@ namespace Orarend } } } + for (int i = maxx + 1; i < 16; i++) //Órák + for (int j = 0; j < 5; j++) //Napok + órarend.Órák[j][i] = null; //Kitörli a küldött órarendben nem szereplő órákat } }); await Task.Delay(10); @@ -140,8 +145,8 @@ namespace Orarend /// /// Frissíti a helyettesítéseket, naponta, indításkor vagy gombnyommásra frissítse (minden nap az első előtérbe kerüléskor) - /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni - Azért funkció, hogy elkerüljök az adatvesztést, mivel így csak a mentéskor nyitja meg /// + /// A file stream, ahova mentse az adatokat, hogy ne kelljen külön meghívni - Azért funkció, hogy elkerüljök az adatvesztést, mivel így csak a mentéskor nyitja meg public static async Task HelyettesítésFrissítés(Func stream) { if (Órarendek.Count == 0 || Osztályok.Length == 0) @@ -167,7 +172,13 @@ namespace Orarend var osztályok = node.ChildNodes[2].InnerText.Split(new string[] { ", " }, StringSplitOptions.None); foreach (string osztálynév in osztályok) { - Osztály osztály = Osztályok.Single(o => o.Azonosító.Contains(osztálynév)); + Osztály osztály = Osztályok.SingleOrDefault(o => o.Azonosító.Contains(osztálynév)); + if (osztály == null) + { + var x = new InvalidOperationException($"A helyettesítésekben szereplő osztály \"{osztálynév}\" nem található."); + x.Data.Add("OERROR", "CLS_NOT_FOUND"); + throw x; + } var csoportok = node.ChildNodes[3].InnerText; int névindex = csoportok.IndexOf(osztálynév); int végeindex = csoportok.IndexOf(")", névindex >= 0 ? névindex : 0); @@ -296,12 +307,16 @@ namespace Orarend } private static DateTime utolsófrissítésplusz1óra = DateTime.MinValue; - public static event EventHandler Frissítéskor; + public static event EventHandler Frissítéskor; + public class FrissítésEventArgs { public bool Siker { get; set; } = false; } private static void frissítésHa1ÓraEltelt() { if (utolsófrissítésplusz1óra > DateTime.Now) return; - Frissítéskor?.Invoke(példány, null); + var args = new FrissítésEventArgs(); + Frissítéskor?.Invoke(példány, args); + if (args.Siker) + utolsófrissítésplusz1óra = DateTime.Now + new TimeSpan(1, 0, 0); } public static DayOfWeek MaiNap diff --git a/Orarend/ÓraTípus.cs b/Orarend/ÓraTípus.cs index b5ca251..1b90a18 100644 --- a/Orarend/ÓraTípus.cs +++ b/Orarend/ÓraTípus.cs @@ -7,7 +7,21 @@ namespace Orarend public class ÓraTípus { [DataMember] - public string TeljesNév { get; set; } + private string teljesnév; + public string TeljesNév + { + get + { + return teljesnév; + } + set + { + if ((value?.Trim()?.Length ?? 0) == 0) + teljesnév = "(" + Azonosító + ")"; + else + teljesnév = value; + } + } [DataMember] public string Azonosító { get; set; } [DataMember] diff --git a/OrarendAndroidApp/MainActivity.cs b/OrarendAndroidApp/MainActivity.cs index cffc7a4..903852e 100644 --- a/OrarendAndroidApp/MainActivity.cs +++ b/OrarendAndroidApp/MainActivity.cs @@ -39,7 +39,7 @@ namespace OrarendAndroidApp ? API.Betöltés(OpenFileInput(DATA_FILENAME), e => Hiba("Hiba az adatok betöltése során!\n" + e)) : API.Betöltés()) { API.CsengőTimerEvent += CsengőTimer; - API.Frissítéskor += (_, __) => HelyettesítésFrissítés(false); + API.Frissítéskor += (_, args) => HelyettesítésFrissítés(false, args); } } @@ -102,7 +102,7 @@ namespace OrarendAndroidApp public void Deconstruct(out T1 first, out T2 second) => (first, second) = obj; } - private void HelyettesítésFrissítés(bool internethiba = true) + private void HelyettesítésFrissítés(bool internethiba = true, API.FrissítésEventArgs args = null) { var bar = FindViewById(Resource.Id.progressBar1); //var menu = FindViewById(Resource.Id.actionMenuView1); @@ -114,12 +114,13 @@ namespace OrarendAndroidApp handler.Post(() => { bar.Visibility = ViewStates.Gone; - if (TaskHiba(t, internethiba)) + if (TaskHibaNemVolt(t, internethiba) && t.Result) { órarendfrissítés(); - if (t.Result) - Toast.MakeText(this, "Helyettesítések frissítve", ToastLength.Short).Show(); + Toast.MakeText(this, "Helyettesítések frissítve", ToastLength.Short).Show(); + if (args != null) args.Siker = true; } + else if (!internethiba && args != null) args.Siker = true; }); }); } @@ -137,7 +138,7 @@ namespace OrarendAndroidApp bar.Visibility = ViewStates.Gone; órarendlistafrissítés(); HelyettesítésFrissítés(); - if (TaskHiba(t)) + if (TaskHibaNemVolt(t)) { if (ór == null || ór == API.Órarend) órarendfrissítés(); @@ -350,7 +351,7 @@ namespace OrarendAndroidApp /// /// Ha igaz, kiírja a WebException-öket is /// Igaz, ha nem volt hiba - private bool TaskHiba(Task t, bool internethiba = true) + private bool TaskHibaNemVolt(Task t, bool internethiba = true) { bool ret = true; foreach (var ex in (IEnumerable)t.Exception?.InnerExceptions ?? new Exception[0]) @@ -362,6 +363,8 @@ namespace OrarendAndroidApp else if (wex.Status == WebExceptionStatus.ConnectFailure) Hiba("Nem sikerült csatlakozni az E-naplóhoz.\nHa van internet, próbáld újraindítani az alkalmazást."); } + else if (ex is InvalidOperationException oex && oex.Data.Contains("OERROR") && (string)oex.Data["OERROR"] == "CLS_NOT_FOUND") + ÓrarendFrissítés(); else Hiba(ex.ToString()); ret = false;