Esempio n. 1
0
 private TimetableVersion[] GetAvailableVersions(TimetableType type)
 {
     return(TimetableVersionExt.GetAllVersionInfos()
            .Where(c => c.Compatibility == TtVersionCompatType.ReadWrite && c.Type == type)
            .Select(c => c.Version)
            .ToArray());
 }
Esempio n. 2
0
        /// <summary>
        /// Formats a given timetable to markdown representation.
        /// </summary>
        /// <param name="timetable">The HTML representation of the timetable.</param>
        /// <param name="timetableType">The type of the timetable to return.</param>
        /// <returns>The markdown representation of the given timetable.</returns>
        public static string Format(string timetable, TimetableType timetableType)
        {
            switch (timetableType)
            {
            case TimetableType.Session:
                return(FormatSessionTimetable(timetable));

            default:
                return(FormatGeneralTimetable(timetable));
            }
        }
Esempio n. 3
0
 internal void New(TimetableType type)
 {
     if (!NotifyIfUnsaved())
     {
         return;
     }
     Timetable          = new Timetable(type);
     FileState.Opened   = true;
     FileState.Saved    = false;
     FileState.FileName = null;
     undo.ClearHistory();
     info.Logger.Info("Neue Datei erstellt");
     FileOpened?.Invoke(this, null);
 }
Esempio n. 4
0
        private async Task OnTimetableAsync(long chatId, TimetableType timetableType)
        {
            try
            {
                var timetable = await TimetableParser.GetAsync(this.configuration.Login, this.configuration.Password, timetableType);

                timetable = TimetableFormatter.Format(timetable, timetableType);
                await this.ReplyAsync(chatId, (timetable.Length > 0)?timetable : "Расписание для студенческой группы отсутствует", timetableType);
            }
            catch (Exception e)
            {
                this.logger.LogError($"{nameof(WebhookClient)} OnTimetableAsync {e.Message}");
                await this.ReplyAsync(chatId, "Не удалось получить информацию о расписании для студенческой группы", timetableType);
            }
        }
Esempio n. 5
0
        private async Task ReplyAsync(long chatId, string message, TimetableType timetableType)
        {
            var keyboard = new InlineKeyboardMarkup(new[]
            {
                new[]
                {
                    new InlineKeyboardButton()
                    {
                        Text         = "Повторить запрос",
                        CallbackData = (timetableType == TimetableType.General) ? "timetable" : "session",
                    },
                },
            });

            await this.client.SendTextMessageAsync(
                chatId : chatId,
                text : message,
                replyMarkup : keyboard,
                parseMode : Telegram.Bot.Types.Enums.ParseMode.MarkdownV2,
                disableWebPagePreview : true).ConfigureAwait(false);
        }
Esempio n. 6
0
 private List<TimetableItem> ParseTable(HtmlDocument document, TimetableType type, StudyYear studyYear = StudyYear.None, HalfYear halfYear = HalfYear.None, string groupNumber = "")
 {
     List<TimetableItem> timetable = new List<TimetableItem>();
     if (document.DocumentNode.Descendants("table").Count() > 0)
     {
         foreach (HtmlNode table in document.DocumentNode.Descendants("table"))
         {
             DayOfWeek day = DayOfWeek.Monday;
             foreach (HtmlNode tableRow in table.Descendants("tr"))
             {
                 bool isDirty = false;
                 if (tableRow.Attributes.Count == 0)
                 {
                     TimetableItem item = null;
                     int index = 0;
                     foreach (HtmlNode tableCell in tableRow.Descendants("td"))
                     {
                         string innerText = tableCell.InnerText.Trim();
                         if (tableCell.Attributes.Count > 0 && tableCell.Attributes[0].Value == "10")
                         {
                             day = new DayOfWeek();
                             day = GetDayFromCell(innerText);
                         }
                         else
                         {
                             switch (index)
                             {
                                 case 0:
                                     item = new TimetableItem();
                                     item.Day = day;
                                     int startHours;
                                     int startMinutes;
                                     if (Int32.TryParse(innerText.Substring(0, 2), out startHours) &&
                                         Int32.TryParse(innerText.Substring(3, 2), out startMinutes))
                                     {
                                         item.StartTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, startHours, startMinutes, 0);
                                     }
                                     break;
                                 case 1:
                                     int endHours;
                                     int endMinutes;
                                     if (Int32.TryParse(innerText.Substring(0, 2), out endHours) &&
                                         Int32.TryParse(innerText.Substring(3, 2), out endMinutes))
                                     {
                                         item.EndTime = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, endHours, endMinutes, 0);
                                     }
                                     break;
                                 case 2:
                                     if (type == TimetableType.Year)
                                     {
                                         item.StudyGroup = GetGroupFromCell(innerText);
                                         index--;
                                         type = TimetableType.Group;
                                         isDirty = true;
                                     }
                                     else
                                     {
                                         item.ClassName = innerText;
                                         if (item.StudyGroup == null)
                                         {
                                             item.StudyGroup = new Group
                                             {
                                                 YearOfStudy = studyYear,
                                                 HalfYearOfStudy = halfYear,
                                                 Number = groupNumber
                                             };
                                         }
                                         if (isDirty)
                                             type = TimetableType.Year;
                                     }
                                     break;
                                 case 3:
                                     item.TypeOfClass = GetClassTypeFromCell(innerText);
                                     break;
                                 case 4:
                                     item.TeacherName = innerText;
                                     break;
                                 case 5:
                                     item.RoomNumber = innerText;
                                     break;
                                 case 6:
                                     item.Frequency = GetFrequencyFromCell(innerText);
                                     break;
                                 case 7:
                                     item.OptionalPackage = GetOptionalPackageFromCell(innerText);
                                     break;
                             }
                             index++;
                         }
                     }
                     if (item != null)
                         timetable.Add(item);
                 }
             }
         }
     }
     return timetable;
 }
Esempio n. 7
0
 public TimetableTypeNotSupportedException(TimetableType type, string feature, Exception innerException)
     : base("Timetable file of type " + type + " does not support the following feature: " + feature, innerException)
 {
 }
Esempio n. 8
0
        /// <summary>
        /// Parsers the web page and returns the string representation of the timetable for the first available day.
        /// </summary>
        /// <param name="login">The login to access the timetable data.</param>
        /// <param name="password">The password to access the timetable data.</param>
        /// <param name="timetableType">The type of the timetable to return.</param>
        /// <returns>The string representation of the timetable for the first available day.</returns>
        public static async Task <string> GetAsync(string login, string password, TimetableType timetableType)
        {
            var baseUrl = (timetableType == TimetableType.General) ? GeneralUrl : SesssionUrl;

            var formVariables = new List <KeyValuePair <string?, string?> >
            {
                new KeyValuePair <string?, string?>("AUTH_FORM", "Y"),
                new KeyValuePair <string?, string?>("TYPE", "AUTH"),
                new KeyValuePair <string?, string?>("backurl", "/cdb/schedule/student.php"),
                new KeyValuePair <string?, string?>("USER_LOGIN", login),
                new KeyValuePair <string?, string?>("USER_PASSWORD", password),
                new KeyValuePair <string?, string?>("Login", "%C2%EE%E9%F2%E8"),
            };

            var cookieContainer = new CookieContainer();
            var timetableUrl    = string.Empty;
            var formContent     = new FormUrlEncodedContent(formVariables);

            string timetable = string.Empty;

            using (var handler = new HttpClientHandler()
            {
                CookieContainer = cookieContainer
            })
            {
                using var client = new HttpClient(handler, false);
                {
                    using var message  = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri(baseUrl), Content = formContent };
                    using var response = await client.SendAsync(message);

                    if (response.IsSuccessStatusCode)
                    {
                        var buffer = await response.Content.ReadAsByteArrayAsync();

                        var encoding       = Encoding.GetEncoding("windows-1251");
                        var responseString = encoding.GetString(buffer, 0, buffer.Length);

                        var document = new HtmlDocument();
                        document.LoadHtml(responseString);

                        var timetableIFrame = document.DocumentNode.SelectNodes("(//iframe[@id='diploma-iframe'])");
                        if (timetableIFrame.Count > 0)
                        {
                            timetableUrl = timetableIFrame[0].Attributes["src"].Value;
                        }
                    }

                    using var message2 = new HttpRequestMessage
                          {
                              Method     = HttpMethod.Get,
                              RequestUri = new Uri(timetableUrl),
                          };
                    using var response2 = await client.SendAsync(message2);

                    if (response2.IsSuccessStatusCode)
                    {
                        timetable = await response2.Content.ReadAsStringAsync();
                    }
                }
            }

            return(timetable);
        }
Esempio n. 9
0
 public TtVersionCompatAttribute(TtVersionCompatType compatType, TimetableType fileType)
 {
     CompatType = compatType;
     FileType   = fileType;
 }