merged from master

This commit is contained in:
2022-11-03 16:42:19 +01:00
19 changed files with 224 additions and 121 deletions

3
.idea/.gitignore generated vendored Normal file
View File

@@ -0,0 +1,3 @@
# Default ignored files
/shelf/
/workspace.xml

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
neca.py

View File

@@ -0,0 +1,6 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="USE_PROJECT_PROFILE" value="false" />
<version value="1.0" />
</settings>
</component>

4
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 3.10" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/twitter-project.iml" filepath="$PROJECT_DIR$/.idea/twitter-project.iml" />
</modules>
</component>
</project>

12
.idea/twitter-project.iml generated Normal file
View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="PyDocumentationSettings">
<option name="format" value="PLAIN" />
<option name="myDocStringFormat" value="Plain" />
</component>
</module>

6
.idea/vcs.xml generated Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
</component>
</project>

View File

Binary file not shown.

View File

@@ -46,7 +46,7 @@ def generate_tweet(ctx, e):
# emit to outside world # emit to outside world
emit('tweet', tweet) emit('tweet', tweet)
for w in words(tweet['text']): for w in words(tweet['text']):
emit('balk', { emit('pie', {
'action': 'add', 'action': 'add',
'value': (str(w), 1) 'value': (str(w), 1)
}) })

View File

@@ -62,7 +62,7 @@
<div class="maintable"> <div class="maintable">
<div class="leftcol column"> <div class="leftcol column">
<span class="colheader">Latest Cluccs</span> <span class="colheader">Latest Cluccs</span>
<div class="tweetcontainer" id="tweet"> <div class="tweetcontainer latest" id="latest">
<div class="tweet"> <div class="tweet">
<img src="https://pbs.twimg.com/profile_images/1158803404656959490/9MKSbW4O_400x400.jpg" alt="" class="tweet-profilepicture"> <img src="https://pbs.twimg.com/profile_images/1158803404656959490/9MKSbW4O_400x400.jpg" alt="" class="tweet-profilepicture">
<div class="tweet-content"> <div class="tweet-content">
@@ -91,27 +91,34 @@
</div> </div>
<div class="centercol column"> <div class="centercol column">
<span class="colheader">Filtered Cluccs</span> <span class="colheader">Filtered Cluccs</span>
<div class="filtered" id="filtered">
</div>
</div> </div>
<div class="rightcol column"> <div class="rightcol column">
<div class="searchcontainer column"> <div class="searchcontainer column">
<input class="searchbar" type="text" placeholder="Search Cluccs"> <input class="searchbar" onchange="updateSearched(this.value)" type="text" placeholder="Search Cluccs">
<input class="blockedwords" type="text" placeholder="Blocked words (separated by comma)"> <input class="blockedwords" onchange="updateBlocked(this.value)" type="text" placeholder="Blocked words (separated by comma)">
<div class="button sort-btn"> <div class="sort-by">
<span class="sortby">Sort By <span class="material-symbols-outlined">arrow_drop_down</span></span> <span class="sort-by-title">Sort By</span>
<div class="sort-dropdown"> <div class="sort-dropdown">
<ul class="sort-dropdown-list"> <ul class="sort-dropdown-list">
<li>Time</li> <li class="current-sort">Time</li>
<li>Likes</li> <li onclick="updateSort('time')">Time</li>
<li>Retweets</li> <li onclick="updateSort('likes')">Likes</li>
<li>Replies</li> <li onclick="updateSort('retweets')">Retweets</li>
<li onclick="updateSort('replies')">Replies</li>
</ul> </ul>
<span class="material-symbols-outlined sort-btn">arrow_drop_down</span>
</div> </div>
</div> </div>
<span class="material-symbols-outlined order-btn">arrow_downward</span> <span class="material-symbols-outlined order-btn">arrow_downward</span>
</div> </div>
<div class="popchart column"> <div class="popchart column">
<span class="colheader chartheader">Sports Popularity Chart</span>
<div id="balk" style="height:300px; background-color: white;"></div> <span class="colheader chartheader">Sports Popularity Filter</span>
<div id="pie" style="height:300px; background-color: white;"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -126,13 +133,14 @@
<script src="./lib/tweets.js"></script> <script src="./lib/tweets.js"></script>
<script src="./js/code.js"></script> <script src="./js/code.js"></script>
<script src="./js/events.js"></script> <script src="./js/events.js"></script>
<script src="./lib/jquery.flot.pie.js"></script>
<script> <script>
block("#tweet").tweets({ block("#latest").tweets({
memory: 20 memory: 20
}); });
block('#balk').barchart(); block('#pie').piechart();
events.connect('balk', '#balk'); events.connect('pie', '#pie');
events.connect("tweet", "#tweet"); events.connect("tweet", "#latest");
// // create a rolling chart block // // create a rolling chart block
// block('#graph').rolling_chart({ // block('#graph').rolling_chart({

View File

@@ -1,12 +1,11 @@
let selectedSports = [] let selectedSports = []
let filters = { let filters = {
selectedSports: selectedSports,
searchedWords: [], searchedWords: [],
blockedWords: [], blockedWords: [],
popularityFilter: {},
sorted: "time", sorted: "time",
order: "desc" order: "desc",
sports: []
} }
function showFeeds() { function showFeeds() {
@@ -30,7 +29,7 @@ function tweetCell(tweet) {
var cell = document.createElement("div"); var cell = document.createElement("div");
cell.innerHTML = cell.innerHTML =
`<div class="tweet"> `<div class="tweet">
<a href ="https://www.twitter.com/${tweet.user.screen_name}"><img src="${tweet.user.profile_image_url}" onerror="this.src='media/logo.png'" class="tweet-profilepicture"></a> <a href ="https://www.twitter.com/${tweet.user.screen_name}"><img src="${tweet.user.profile_image_url}" onerror="this.src='media/logo.png';" class="tweet-profilepicture"></a>
<div class="tweet-content"> <div class="tweet-content">
<div class="tweet-name"> <div class="tweet-name">
<div> <div>
@@ -59,22 +58,13 @@ function tweetCell(tweet) {
return cell return cell
} }
function filterTweets(tweets, bannedWords=[], searchWords=[], likesTop=null, likesBottom=null, retweetsTop=null, retweetsBottom=null, repliesTop=null, repliesBottom=null) { function filterTweets(tweets, bannedWords=[], searchWords=[], sorted, order) {
if(bannedWords.length > 0){ if(bannedWords.length > 0){
tweets = filterBannedWords(bannedWords, tweets) tweets = filterBannedWords(bannedWords, tweets)
} }
if(searchWords.length > 0){ if(searchWords.length > 0){
tweets = searchForWords(searchWords, tweets) tweets = searchForWords(searchWords, tweets)
} }
if(likesTop != null || likesBottom != null){
tweets = filterLikes(likesTop, likesBottom, tweets)
}
if(retweetsTop != null || retweetsBottom != null){
tweets = filterRetweets(retweetsTop, retweetsBottom, tweets)
}
if(repliesTop != null || repliesBottom != null){
tweets = filterReplies(repliesTop, repliesBottom, tweets)
}
return tweets return tweets
} }
@@ -92,71 +82,56 @@ function filterBannedWords(bannedWords, tweets){
} }
function searchForWords(searchWords, tweets){ function searchForWords(searchWords, tweets){
var filteredTweets = []
for (let i = 0; i < tweets.length; i++) { for (let i = 0; i < tweets.length; i++) {
var tweet = tweets[i] var tweet = tweets[i]
for(let i=0; i < searchWords.length; i++){ for(let i=0; i < searchWords.length; i++){
if (!tweet.text.toLowerCase().includes(searchWords[i].toLowerCase())) { var text = tweet.text.toLowerCase()
tweets.splice(i, 1) var word = searchWords[i].toLowerCase()
if (text.includes(word)) {
filteredTweets.push(tweet)
break break
} }
} }
} }
return tweets return filteredTweets.reverse()
} }
function filterLikes(likesTop, likesBottom, tweets){ function sortTweets(tweets, sort){
for (let i = 0; i < tweets.length; i++) { if(typeof sort.sortby == 'undefined'){
var tweet = tweets[i]
if(tweet.favorite_count >= likesTop || tweet.favorite_count <= likesBottom){
tweets.splice(i, 1)
break
}
}
return tweets return tweets
} }
if(typeof sort.order == 'undefined'){
function filterRetweets(retweetsTop, retweetsBottom, tweets){ sort.order = 'asc'
for (let i = 0; i < tweets.length; i++) {
var tweet = tweets[i]
if(tweet.retweet_count >= retweetsTop || tweet.retweet_count <= retweetsBottom){
tweets.splice(i, 1)
break
}
}
return tweets
} }
function filterReplies(repliesTop, repliesBottom, tweets){ if(sort.sortby == "likes"){
for (let i = 0; i < tweets.length; i++) { if(sort.order == 'asc'){
var tweet = tweets[i]
if(tweet.reply_count >= repliesTop || tweet.reply_count <= repliesBottom){
tweets.splice(i, 1)
break
}
}
return tweets
}
function sortTweets(tweets, likesDes=null, retweetsDes=null, repliesDes=null, dateDes=null){
if(likesDes && likesDes!=null){
tweets.sort(function(a,b){return b.favorite_count-a.favorite_count}) tweets.sort(function(a,b){return b.favorite_count-a.favorite_count})
} else if (!likesDes && likesDes!=null){ } else{
tweets.sort(function(a,b){return a.favorite_count-b.favorite_count}) tweets.sort(function(a,b){return a.favorite_count-b.favorite_count})
} }
if(retweetsDes && retweetsDes!=null){ }
if(sort.sortby == "retweets"){
if(sort.order == 'asc'){
tweets.sort(function(a,b){return b.retweet_count-a.retweet_count}) tweets.sort(function(a,b){return b.retweet_count-a.retweet_count})
} else if (!retweetsDes && retweetsDes!=null){ } else{
tweets.sort(function(a,b){return a.retweet_count-b.retweet_count}) tweets.sort(function(a,b){return a.retweet_count-b.retweet_count})
} }
if(repliesDes && repliesDes!=null){ }
if(sort.sortby == "replies"){
if(sort.order == 'asc'){
tweets.sort(function(a,b){return b.reply_count-a.reply_count}) tweets.sort(function(a,b){return b.reply_count-a.reply_count})
} else if (!repliesDes && repliesDes!=null){ } else {
tweets.sort(function(a,b){return a.reply_count-b.reply_count}) tweets.sort(function(a,b){return a.reply_count-b.reply_count})
} }
if(dateDes && dateDes!=null){ }
if (sort.sortby == "date"){
if(sort.order == 'asc'){
tweets.sort(function(a,b){return Date(b.created_at)-Date(a.reply_count)}) tweets.sort(function(a,b){return Date(b.created_at)-Date(a.reply_count)})
} else if (!dateDes && dateDes!=null){ } else{
tweets.sort(function(a,b){return Date(a.created_at)-Date(b.reply_count)}) tweets.sort(function(a,b){return Date(a.created_at)-Date(b.reply_count)})
} }
}
return tweets return tweets
} }

View File

@@ -1,11 +1,16 @@
// Selected = is clicked sport selected or not, BOOL // Selected = is clicked sport selected or not, BOOL
// Sports = all selected sports, ARRAY // Sports = all selected sports, ARRAY
$(".sport").on("selected", function(e, selected, sports) { $(".sport").on("selected", function(e, selected, sports) {
console.log(selected, sports); filters.sports = sports;
$(window).trigger("filter");
}) })
window.addEventListener('DOMContentLoaded', (event) => { window.addEventListener('DOMContentLoaded', (event) => {
window.sessionStorage.setItem('tweets', JSON.stringify([])); window.sessionStorage.setItem('tweets', JSON.stringify([]));
// run code every 5 seconds
setInterval(function() {
$(window).trigger("filter");
}, 1000);
}); });
$(".sport").on("click", function() { $(".sport").on("click", function() {
@@ -21,8 +26,8 @@ $(".sport").on("click", function() {
selectedSports.push(sportName) // Add sport to array selectedSports.push(sportName) // Add sport to array
} }
$(this).trigger("selected", [selectedSports.includes(sportName), selectedSports]) // Trigger event
showFeeds() showFeeds()
$(this).trigger("selected", [selectedSports.includes(sportName), selectedSports]) // Trigger event
}) })
$(window).on("resize", function(){ $(window).on("resize", function(){
@@ -33,26 +38,13 @@ $(window).on("load", function() {
showFeeds() showFeeds()
}) })
$(".sortby").on("click", function() {
$(".sort-dropdown").toggle()
// $(".sort-btn").toggleClass("radius-bottom")
})
$(".sort-dropdown-list li").on("click", function() {
$(".sort-dropdown").toggle()
filters.sorted = $(this).val()
$(window).trigger("test", filters)
})
$(window).on("test", function(e, filter) {
console.log(filter);
})
let root = document.querySelector(":root") let root = document.querySelector(":root")
$(".logo").on("click", function() { $(".logo").on("click", function() {
if (root.style.getPropertyValue("--main-bg") === 'snow') { if (root.style.getPropertyValue("--main-bg") === 'snow') {
console.log("IM here") console.log("IM here")
var audio = new Audio("../media/Chicken.mp3");
audio.play();
root.style.setProperty('--main-medium-dark', '#1E1E1E'); root.style.setProperty('--main-medium-dark', '#1E1E1E');
root.style.setProperty('--main-bg', '#292929'); root.style.setProperty('--main-bg', '#292929');
root.style.setProperty('--main-light', ' #ffffff' ); root.style.setProperty('--main-light', ' #ffffff' );
@@ -60,6 +52,8 @@ $(".logo").on("click", function() {
root.style.setProperty('--tweet-color', '#000000') root.style.setProperty('--tweet-color', '#000000')
root.style.setProperty('--column-color', '#1E1E1E') root.style.setProperty('--column-color', '#1E1E1E')
} else { } else {
var audio = new Audio("../media/Rooster.mp3");
audio.play();
root.style.setProperty('--main-medium-dark', '#1D9BF0'); root.style.setProperty('--main-medium-dark', '#1D9BF0');
root.style.setProperty('--main-bg', 'snow'); root.style.setProperty('--main-bg', 'snow');
root.style.setProperty('--main-light', '#000000'); root.style.setProperty('--main-light', '#000000');
@@ -69,10 +63,60 @@ $(".logo").on("click", function() {
} }
}) })
$(window).on("filter", function() {
var parent = document.querySelector("#filtered")
parent.replaceChildren();
tweets = window.sessionStorage.getItem('tweets');
tweets = JSON.parse(tweets);
tweets = filterTweets(tweets, filters.blockedWords, filters.searchedWords.concat(filters.sports), filters.sorted, filters.order);
tweets = sortTweets(tweets, [filters.sorted, filters.order]);
var displayTweets = tweets.reverse().slice(0, 20).reverse();
for (i = 0; i < Math.min(19, displayTweets.length); i++){
tweet = displayTweets[i];
parent.prepend(tweetCell(tweet));
}
})
$(".current-sort").on("click", function() {
$(".sort-dropdown-list li:not(:first-of-type)").toggle()
})
$(".sort-btn").on("click", function() {
$(".sort-dropdown-list li:not(:first-of-type)").toggle()
})
$(".sort-dropdown-list li:not(:first-of-type)").on("click", function() {
$(".sort-dropdown-list li:not(:first-of-type)").toggle()
$(".current-sort").html($(this).html())
})
$(".order-btn").on("click", function() { $(".order-btn").on("click", function() {
if($(this).html() == "arrow_downward") { // Descending to ascending if($(this).html() == "arrow_downward") { // Descending to ascending
$(this).html("arrow_upward") $(this).html("arrow_upward")
filters.order = 'asc'
} else { // Ascending to descending } else { // Ascending to descending
$(this).html("arrow_downward") $(this).html("arrow_downward")
filters.order = 'desc'
} }
$(window).trigger("filter")
}) })
function updateSearched(searched){
searched = searched.split(",");
filters.searchedWords = searched;
$(window).trigger("filter");
}
function updateBlocked(blocked){
blocked = blocked.split(",");
filters.blockedWords = blocked;
$(window).trigger("filter");
}
function updateSort(sort){
sortarray = []
filters.sorted = sort;
$(window).trigger("filter");
}

View File

@@ -68,11 +68,13 @@ var process_entities = function(message, entities) {
block.fn.tweets = function(config) { block.fn.tweets = function(config) {
var options = $.extend({ var options = $.extend({
memory: 100 memory: 20
}, config); }, config);
// store list for later // store list for later
var $list = $("div.tweetcontainer"); // var $list = $("div.tweetcontainer");
var $list = document.querySelector("#latest")
window.sessionStorage.setItem('tweets', JSON.stringify([]));
// register default handler for handling tweet data // register default handler for handling tweet data
this.actions(function(e, tweet){ this.actions(function(e, tweet){
@@ -85,13 +87,13 @@ block.fn.tweets = function(config) {
} }
window.sessionStorage.setItem('tweets', JSON.stringify(tweets)); window.sessionStorage.setItem('tweets', JSON.stringify(tweets));
var $item = tweetCell(tweet) // remove tweets
$list.prepend($item); $list.replaceChildren();
var displayTweets = tweets.reverse().slice(0, options.memory).reverse();
// remove stale tweets for (i = 0; i < Math.min(options.memory-1, displayTweets.length); i++){
if ($list.children().length > options.memory) { $list.prepend(tweetCell(displayTweets[i]));
$list.children().last().remove();
} }
}); });
return this.$element; return this.$element;

View File

Binary file not shown.

View File

Binary file not shown.

View File

@@ -9,6 +9,7 @@
@media only screen and (max-width: 850px) { @media only screen and (max-width: 850px) {
.maintable { .maintable {
grid-template-columns: 1fr; grid-template-columns: 1fr;
grid-template-rows: 1fr 100%;
} }
.header-title { .header-title {
display: none; display: none;
@@ -22,6 +23,15 @@
.colheader { .colheader {
font-size: 32px; font-size: 32px;
} }
.popchart {
display: none;
}
.leftcol {
overflow-y: auto;
}
.rightcol {
grid-row: 1;
}
} }

View File

@@ -267,33 +267,57 @@ body {
user-select: none; user-select: none;
} }
.sort-btn { .sort-by {
user-select: none; user-select: none;
position: relative; display: flex;
padding: 8px;
}
.sort-by-title {
font-size: 24px;
font-weight: 500;
margin-right: 8px;
} }
.sort-dropdown { .sort-dropdown {
display: none; display: flex;
align-items: flex-start;
position: relative;
} }
.sort-dropdown-list { .sort-dropdown-list {
/* position: absolute; */ /* position: absolute; */
width: 100%;
list-style-type: none; list-style-type: none;
padding: 0; padding: 0;
margin: 0; margin: 0;
margin-left: -8px; background-color: white;
background-color: var(--main-light); width: 150px;
border-radius: 0 0 16px 16px; border-radius: 16px;
}
.material-symbols-outlined.sort-btn {
position: absolute;
right: 0;
top: 5px;
color: black;
font-size: 26px;
}
.sort-dropdown-list li:not(:first-of-type) {
display: none;
}
.sort-dropdown-list li:not(:first-of-type):hover {
background-color: rgb(215, 215, 215);
} }
.sort-dropdown-list li { .sort-dropdown-list li {
color: #1E1E1E;
font-weight: 500; font-weight: 500;
font-size: 22px; font-size: 22px;
padding: 0 8px; padding: 0 8px;
} }
.radius-bottom { .current-sort {
border-bottom-left-radius: 16px; line-height: 36px;
border-bottom-right-radius: 16px;
} }

View File

Binary file not shown.

View File

Binary file not shown.