Skip to content

Instantly share code, notes, and snippets.

@KotRikD
Created December 10, 2019 18:54
Show Gist options
  • Save KotRikD/8aaa8237d0127c930ffa566f15411989 to your computer and use it in GitHub Desktop.
Save KotRikD/8aaa8237d0127c930ffa566f15411989 to your computer and use it in GitHub Desktop.
Dnevnik.mos.ru hw editor
// ==UserScript==
// @name Dnevnik.mos.ru Homework editor
// @namespace http://dnevnik.mos.ru/
// @version 0.1
// @description Просто давайте редактировать домашку
// @author KotRik
// @match https://dnevnik.mos.ru/student_diary/student_diary/*
// @grant none
// @require http://code.jquery.com/jquery-3.4.1.min.js
// ==/UserScript==
function writeIntoStorage(key, object) {
try {
localStorage.setItem(key, JSON.stringify(object));
return true;
} catch(e) {
console.log(e);
return false;
}
}
function readFromStorage(key) {
try {
let object = JSON.parse(localStorage.getItem(key));
return object;
} catch (e) {
console.log(e);
return null;
}
}
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function init() {
while (document.querySelectorAll("div.homeworks").length < 2) {
await sleep(1000); // Спим 4 секунды, пока не загрузимся
}
let homeworks = document.querySelectorAll("div.homeworks"); // Элементы домашки
let value = document.querySelectorAll("input.date-range-input.ng-pristine.ng-valid")
if (value.length < 1) {
console.log("panic! Input with date not found");
return;
}
value = value[0].value;
let store = readFromStorage("krCustomHW");
if (store === null) {
writeIntoStorage("krCustomHW", {
'days': {}
});
store = readFromStorage("krCustomHW");
}
// TODO: Если здесь ничего не изменится, объединить эти списки
// Теперь получаем ключи для текущей недели)
let keys = store.days[value];
if (typeof(keys) !== "object" || keys.length !== homeworks.length) {
// Ключей нет(, давайте обновим их
console.log("updating keys for this week");
let newKeys = [];
for (let i = 0; i<homeworks.length; i++) {
// И засунем количество стрингов = homeworks
newKeys.push("")
}
keys = newKeys; // Ура, ключи обновлены
store.days[value] = newKeys;
}
writeIntoStorage("krCustomHW", store); // Обновляем хранилище, после всего этого безумия
// Теперь сделаем сопоставим ключи и покажем кастомное ДЗ
for (let [ind, value] of keys.entries()) {
if (value.length < 1) continue; // Не имеет смысла, тк это пустая строчка
$(homeworks[ind]).html(`
<div _ngcontent-c18="" class="homework-item ng-star-inserted" fxlayout="row" style="flex-direction: row; box-sizing: border-box; display: flex;">
<div _ngcontent-c18="" fxflex="" style="flex: 1 1 0%; box-sizing: border-box;">
<div _ngcontent-c18="" class="homework-description ng-star-inserted">${value}
</div>
</div>
</div>
`)
//homeworks[ind].innerHTML = value;
}
for (let [ind, value] of keys.entries()) {
let newEl = $(`
<div style="display: flex; flex-direction: row; justify-content: flex-end; align-items: center; height: fit-content;">
<p style="margin: 0; padding: 0;">
<span data-vdomid=${ind} style="display:inline-block; width: 16px; height: 16px; border-radius: 30px; background-color: #00acc1; margin: 5px; cursor: pointer;" >
</p>
</div>
`)
newEl.on("click", "span", function(event) {
event.preventDefault();
let id = $(this).data("vdomid");
let newHW = window.prompt("Введи новое ДЗ", "")
if (newHW === null || newHW === undefined) {
newHW = "";
}
let homeworks = document.querySelectorAll("div.homeworks"); // Элементы домашки
let value = document.querySelectorAll("input.date-range-input.ng-pristine.ng-valid")
if (value.length < 1) {
console.log("panic! Input with date not found");
return;
}
value = value[0].value;
let store = readFromStorage("krCustomHW");
store.days[value][id] = newHW;
console.log(store.days[value][id]);
writeIntoStorage("krCustomHW", store);
if ($(homeworks[id]).children().length > 1) {
$(homeworks[id]).children()[0].remove()
}
$(`
<div _ngcontent-c18="" class="homework-item ng-star-inserted" fxlayout="row" style="flex-direction: row; box-sizing: border-box; display: flex;">
<div _ngcontent-c18="" fxflex="" style="flex: 1 1 0%; box-sizing: border-box;">
<div _ngcontent-c18="" class="homework-description ng-star-inserted">${newHW}
</div>
</div>
</div>
`).insertBefore($(homeworks[id]).children()[0])
});
$(homeworks[ind]).append(newEl)
}
}
$( document ).ready(async function() {
init();
while (document.querySelectorAll("div.homeworks").length < 2) {
await sleep(1000); // Спим 4 секунды, пока не загрузимся
}
let buttons = document.querySelectorAll("mat-icon.arrow-icon.mat-icon");
while (buttons.length < 2) {
await sleep(2000);
}
// 0 < 1 >
// Это обработчики для кнопок назад и вперёд ;D
$(buttons[0]).click(async function () {
await sleep(3000);
init();
})
$(buttons[1]).click(async function () {
await sleep(3000);
init();
})
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment