This commit is contained in:
sShemet
2025-12-31 16:57:55 +05:00
parent ade2833df7
commit d114970eec
8 changed files with 149 additions and 208 deletions

View File

@@ -2,12 +2,6 @@
"folders": [ "folders": [
{ {
"path": "." "path": "."
},
{
"path": "csharp/Chapter01/HelloCS"
},
{
"path": "repos"
} }
], ],
"settings": {} "settings": {}

Binary file not shown.

View File

@@ -3,7 +3,7 @@ bot_secret = 6454033742:AAFj2rUoVb2jJ_Lew4eiIecdr7s7xbrqeNU
enabled = 1 enabled = 1
[Youtube] [Youtube]
video_id = coYw-eVU0Ks video_id = SsC29jqiNto
[Twitch] [Twitch]
channel = wanderbraun channel = wanderbraun

9
huy.py
View File

@@ -21,7 +21,7 @@ from zoneinfo import *
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
import pytchat import pytchat
import telegram import telegram
from donationalerts import DonationAlertsAPI, Scope from donationalerts import DonationAlertsAPI, Scopes
from urllib import parse from urllib import parse
sys.path.append('twitchchatirc') sys.path.append('twitchchatirc')
import twitch import twitch
@@ -37,8 +37,7 @@ alerts = DonationAlertsAPI(
config['Alerts']['api_key'], config['Alerts']['api_key'],
"http://127.0.0.1:8008/login", "http://127.0.0.1:8008/login",
[ [
Scope.OAUTH_USER_SHOW, Scopes.USER_SHOW,
Scope.OAUTH_DONATION_INDEX
] ]
) )
@@ -52,7 +51,7 @@ class DateTimeEncoder(json.JSONEncoder):
return json.JSONEncoder.default(self, o) return json.JSONEncoder.default(self, o)
chat = pytchat.create(video_id=config['Youtube']['video_id']) # chat = pytchat.create(video_id=config['Youtube']['video_id'])
# twitchConn = twitch_chat_irc.TwitchChatIRC() # twitchConn = twitch_chat_irc.TwitchChatIRC()
@@ -176,7 +175,7 @@ def makeJSONObject(): #we are parsing TG and YT
tw_comments = twitch_socket.all_messages tw_comments = twitch_socket.all_messages
get_yt() #Get YouTube # get_yt() #Get YouTube
try: try:
get_alerts() #Get Donations get_alerts() #Get Donations

View File

@@ -12,7 +12,7 @@ from zoneinfo import ZoneInfo
from http.server import BaseHTTPRequestHandler, HTTPServer from http.server import BaseHTTPRequestHandler, HTTPServer
import pytchat import pytchat
import telegram import telegram
from donationalerts import DonationAlertsAPI, Scope from donationalerts import DonationAlertsAPI, Scopes
from urllib import parse from urllib import parse
import emoji import emoji
sys.path.append('twitchchatirc') sys.path.append('twitchchatirc')
@@ -73,7 +73,7 @@ class DonationAlertsService:
config.alerts_app_id, config.alerts_app_id,
config.alerts_api_key, config.alerts_api_key,
"http://127.0.0.1:8008/login", "http://127.0.0.1:8008/login",
[Scope.OAUTH_USER_SHOW, Scope.OAUTH_DONATION_INDEX] [Scopes.USER_SHOW]
) )
self.access_token = None self.access_token = None
@@ -222,7 +222,7 @@ class ChatAggregator:
self.services = { self.services = {
'alerts': DonationAlertsService(self.config), 'alerts': DonationAlertsService(self.config),
'telegram': TelegramService(self.config), 'telegram': TelegramService(self.config),
'youtube': YouTubeService(self.config), # 'youtube': YouTubeService(self.config),
'twitch': TwitchService(self.config) 'twitch': TwitchService(self.config)
} }
self.comments = [] self.comments = []
@@ -265,7 +265,7 @@ class ChatAggregator:
new_comments.extend(self.services['alerts'].get_donations()) new_comments.extend(self.services['alerts'].get_donations())
# YouTube # YouTube
new_comments.extend(self.services['youtube'].get_messages()) # new_comments.extend(self.services['youtube'].get_messages())
# Telegram # Telegram
if self.config.telegram_enabled: if self.config.telegram_enabled:
@@ -352,7 +352,7 @@ class ChatAggregator:
def log_message(self, format, *args): def log_message(self, format, *args):
return return
server_address = ('', 8008) server_address = ('127.0.0.1', 8008)
httpd = HTTPServer(server_address, lambda *args: Handler(*args, aggregator=self)) httpd = HTTPServer(server_address, lambda *args: Handler(*args, aggregator=self))
print(f'Starting HTTP server on port 8008...') print(f'Starting HTTP server on port 8008...')
httpd.serve_forever() httpd.serve_forever()

View File

@@ -1,48 +1,36 @@
<!DOCTYPE html> <!DOCTYPE html>
<head> <head>
<meta charset="utf-8" /> <meta charset="utf-8" />
<title>template</title> <title>SSH UltraChat</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Condensed"> <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Condensed">
<style> <style>
body { body {
margin: 0;
padding: 0;
background-color: #494949; background-color: #494949;
display: flex; display: flex;
align-items: center; align-items: flex-start;
justify-content: center; justify-content: center;
align-content: flex-end; height: 100vh;
font-family: "Roboto Condensed", sans-serif; font-family: "Roboto Condensed", sans-serif;
font-size: 1em; color: #fff;
letter-spacing: 0.1px;
color: lighter;
text-rendering: optimizeLegibility;
text-shadow: 1px 1px 1px rgba(0,0,0,0.004);
-webkit-font-smoothing: antialiased;
} }
#chatwin { #chatwin {
/* color: white; */ height: 80vh;
height: 100%;
min-width: 150px;
max-width: 500px; max-width: 500px;
min-width: 150px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
padding: 10px;
position: relative;
} }
.chatRow { .chatRow {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
margin-bottom: 1px; margin-bottom: 5px;
width: 100%;
} }
.nameline { .nameline {
@@ -50,38 +38,7 @@ body {
padding: 5px; padding: 5px;
width: 25%; width: 25%;
text-align: center; text-align: center;
display: flex;
justify-content: center;
align-items: center;
font-weight: bold; font-weight: bold;
flex-direction: column;
vertical-align: auto;
}
.yt {
background-image: url('data:image/svg+xml,<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"><g fill="%239C92AC" fill-opacity="0.4" fill-rule="evenodd"><path d="M0 40L40 0H20L0 20M40 40V20L20 40"/></g></svg>');
background-color: #E53935A0;
}
.tg {
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill-rule="evenodd"><g fill="%239C92AC" fill-opacity="0.4"><path opacity=".5" d="M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z"/><path d="M6 5V0H5v5H0v1h5v94h1V6h94V5H6z"/></g></g></svg>');
background-color: #2196F3A0;
}
.tw {
background-color: #6034b2A0 ;
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='60' viewBox='0 0 20 12'><g fill-rule='evenodd'><g id='charlie-brown' fill='%236441a5' fill-opacity='0.35'><path d='M9.8 12L0 2.2V.8l10 10 10-10v1.4L10.2 12h-.4zm-4 0L0 6.2V4.8L7.2 12H5.8zm8.4 0L20 6.2V4.8L12.8 12h1.4zM9.8 0l.2.2.2-.2h-.4zm-4 0L10 4.2 14.2 0h-1.4L10 2.8 7.2 0H5.8z'/></g></g></svg>");
}
/* <svg xmlns='http://www.w3.org/2000/svg' width='120' height='120' viewBox='0 0 120 120'><rect fill='#6441A5' width='120' height='120'/><polygon fill='#5C3C98' fill-opacity='1' points='120 120 60 120 90 90 120 60 120 0 120 0 60 60 0 0 0 60 30 90 60 120 120 120 '/></svg> */
.donate {
background-image: url('back-coin.jpg');
/* background-size: 500px; */
color: black !important;
}
.hello {
background-color: #00bb77;
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='59' height='59' viewBox='0 0 120 120'><polygon fill='%23000' fill-opacity='0.11' points='120 0 120 60 90 30 60 0 0 0 0 0 60 60 0 120 60 120 90 90 120 60 120 0'/></svg>");
} }
.msgline { .msgline {
@@ -89,37 +46,35 @@ body {
width: 75%; width: 75%;
color: #fff; color: #fff;
} }
/* Сохраняем оригинальные стили фона */
.yt {
background-image: url('data:image/svg+xml,<svg width="40" height="40" viewBox="0 0 40 40" xmlns="http://www.w3.org/2000/svg"><g fill="%239C92AC" fill-opacity="0.4" fill-rule="evenodd"><path d="M0 40L40 0H20L0 20M40 40V20L20 40"/></g></svg>');
background-color: #E53935A0;
}
.tg {
background-image: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" width="100" height="100" viewBox="0 0 100 100"><g fill-rule="evenodd"><g fill="%239C92AC" fill-opacity="0.4"><path opacity=".5" d="M96 95h4v1h-4v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4h-9v4h-1v-4H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15v-9H0v-1h15V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h9V0h1v15h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9h4v1h-4v9zm-1 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm9-10v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-10 0v-9h-9v9h9zm-9-10h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9zm10 0h9v-9h-9v9z"/><path d="M6 5V0H5v5H0v1h5v94h1V6h94V5H6z"/></g></g></svg>');
background-color: #2196F3A0;
}
.tw {
background-color: #6034b2A0 ;
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='100' height='60' viewBox='0 0 20 12'><g fill-rule='evenodd'><g id='charlie-brown' fill='%236441a5' fill-opacity='0.35'><path d='M9.8 12L0 2.2V.8l10 10 10-10v1.4L10.2 12h-.4zm-4 0L0 6.2V4.8L7.2 12H5.8zm8.4 0L20 6.2V4.8L12.8 12h1.4zM9.8 0l.2.2.2-.2h-.4zm-4 0L10 4.2 14.2 0h-1.4L10 2.8 7.2 0H5.8z'/></g></g></svg>");
}
.donate {
background-image: url('back-coin.jpg');
color: black !important;
}
.hello {
background-color: #00bb77;
background-image: url("data:image/svg+xml,<svg xmlns='http://www.w3.org/2000/svg' width='59' height='59' viewBox='0 0 120 120'><polygon fill='%23000' fill-opacity='0.11' points='120 0 120 60 90 30 60 0 0 0 0 0 60 60 0 120 60 120 90 90 120 60 120 0'/></svg>");
}
</style> </style>
</head> </head>
<body> <body>
<div id="chatwin"></div>
<div id="chatwin">
<!--
<div idd="1" class="chatRow">
<div class="nameline tg">Edvard Force</div>
<div class="msgline">вот Тенчу Великому зашла , он в ней быстро разобрался и втащил за один стрим )))) ждем когда до нее доберется ))))</div>
</div>
<div idd="2" class="chatRow">
<div class="nameline tg" >Диванный Воин</div>
<div class="msgline">dc или если ты действительно решишь дать бан то мышкой два клика не сделаешь?</div>
</div>
<div idd="3" class="chatRow">
<div class="nameline tg">Yoshka's Cat</div>
<div class="msgline">великий ну эта часть ванпис лутьше чем вариорсы надо признать</div>
</div>
<div idd="4" class="chatRow">
<div class="nameline yt">XAOSHammer</div>
<div class="msgline">Великий а куда друг твой пропал спец по японскому языку ?))))</div>
</div>
<div idd="5" class="chatRow">
<div class="nameline tg">Kino Konformist</div>
<div class="msgline">вот Тенчу Великому зашла , он в ней быстро разобрался и втащил за один стрим )))) ждем когда до нее доберется ))))</div>
</div>
-->
<div id="anchor"></div>
</div>
<script src="script.js"></script> <script src="script.js"></script>
</body> </body>

View File

@@ -41,108 +41,91 @@ let messages = [
"Kino Konformist" ]; "Kino Konformist" ];
const chatwin = document.getElementById("chatwin"); const chatwin = document.getElementById("chatwin");
const anchor = document.getElementById("anchor");
function randomMessage() { function randomMessage() {
return messages[(Math.random() * messages.length) | 0]; return messages[(Math.random() * messages.length) | 0];
} }
function randomNick() { function randomNick() {
return nicks[(Math.random() * nicks.length) | 0]; return nicks[(Math.random() * nicks.length) | 0];
} }
function randomChat() { if (Math.random() * 2 > 1) {return "tg"} else { return "yt" } } function randomChat() {
return Math.random() > 0.5 ? "tg" : "yt";
function goDown() {
window.scrollTo({ top: document.body.scrollHeight, behavior: 'smooth' });
} }
function removeElementsByClass(className){ function scrollToBottom() {
const elements = document.getElementsByClassName(className); chatwin.scrollTop = chatwin.scrollHeight;
while(elements.length > 15){ }
elements[0].parentNode.removeChild(elements[0]);
function removeOldMessages() {
const children = Array.from(chatwin.children);
while (children.length > 15) {
chatwin.removeChild(children[0]);
} }
} }
function createChatLine() { function createChatLine() {
const nm = document.createElement("div"); const nm = document.createElement("div");
nm.className = "nameline " + randomChat(); nm.className = "nameline " + randomChat();
nm.innerHTML = randomNick(); nm.textContent = randomNick();
const msg = document.createElement("div"); const msg = document.createElement("div");
msg.className = "msgline"; msg.className = "msgline";
msg.innerHTML = randomMessage(); msg.textContent = randomMessage();
const rw = document.createElement("div"); const rw = document.createElement("div");
rw.className = "chatRow"; rw.className = "chatRow";
rw.appendChild(nm); rw.appendChild(nm);
rw.appendChild(msg); rw.appendChild(msg);
console.log(rw);
chatwin.insertBefore(rw, anchor); chatwin.appendChild(rw);
scrollToBottom();
removeOldMessages();
goDown();
} }
function createNewLine(json) { function createNewLine(json) {
json.forEach(element => { json.forEach(element => {
const existing = document.getElementById(element.id);
//checking new IDs on screen and print if (existing) {
existing.querySelector('.msgline').textContent = element.msg;
//const elements = document.getElementsByName(element["id"]);
//if (elements.length > 0) { //if this id is present on screen
let curline = document.getElementById(element["id"])
if (curline) {
curline.innerHTML = element["msg"]
return; return;
}; //Updating text... }
const nm = document.createElement("div"); const nm = document.createElement("div");
nm.className = "nameline " + element["type"]; nm.className = "nameline " + element.type;
nm.innerHTML = element["sendr"]; nm.textContent = element.sendr;
if (element["type"] == "donate") { nm.innerHTML = nm.innerHTML + '<br><p style="color: red">' + element['amount']+"</p>" }
if (element.type === "donate") {
nm.innerHTML += `<br><p style="color: red">${element.amount}</p>`;
}
const msg = document.createElement("div"); const msg = document.createElement("div");
msg.className = "msgline"; msg.className = "msgline";
msg.innerHTML = element["msg"]; msg.textContent = element.msg;
msg.setAttribute("id", element["id"]); msg.id = element.id;
if (element["type"] == "donate") { msg.style="background-color: #0000FF20" }
if (element.type === "donate") {
msg.style.backgroundColor = "#0000FF20";
}
const rw = document.createElement("div"); const rw = document.createElement("div");
rw.className = "chatRow"; rw.className = "chatRow";
rw.setAttribute("name", element["id"]);
rw.appendChild(nm); rw.appendChild(nm);
rw.appendChild(msg); rw.appendChild(msg);
//console.log(rw);
chatwin.insertBefore(rw, anchor);
chatwin.appendChild(rw);
scrollToBottom();
removeOldMessages();
}); });
} }
function requestNewLines() { function requestNewLines() {
fetch("http://localhost:8008/")
var request = new XMLHttpRequest(); .then(response => response.json())
request.open('GET', "http://localhost:8008/"); .then(data => createNewLine(data))
request.responseType = 'json'; .catch(error => console.error('Ошибка:', error));
request.send();
request.onload = function() {
var chatJSON = request.response;
createNewLine(chatJSON);
goDown();
}
} }
setInterval(requestNewLines, 1000); setInterval(requestNewLines, 1000);
// setInterval(createChatLine, 3000);

10
yttest.py Normal file
View File

@@ -0,0 +1,10 @@
from donationalerts import DonationAlertsAPI, Scopes
api = DonationAlertsAPI(
client_id="your_id",
client_secret="your_secret",
redirect_uri="http://127.0.0.1:8008/login",
scopes=[Scopes.USER_SHOW]
)
print("Auth URL:", api.authorize.login())